首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏全栈程序员必看

    一个简单的Parallel.ForEach实现

    ParallelForEach<T>(this IEnumerable<T> enumerable, Action<T> action, int NumberOfParallelTasks) { var syncRoot WaitHandle>(NumberOfParallelTasks); for (int i = 0; i < NumberOfParallelTasks; i++) { lock (syncRoot enumerator.Current; } var iAsyncResult = del.BeginInvoke(enumerator, action, seedItemArray[i], syncRoot } } delegate void InvokeAsync<T>(IEnumerator<T> enumerator, Action<T> achtion, T item, object syncRoot static void InvokeAction<T>(IEnumerator<T> enumerator, Action<T> action, T item, object syncRoot

    63050编辑于 2022-09-09
  • 来自专栏walterlv - 吕毅的博客

    为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?

    虽然泛型版本的 ICollection<T> 已经改进了设计,不再引入 SyncRoot 这样的属性到接口中,但如果我们在某些场景下需要实现 ICollection 非泛型集合时,如何正确实现 SyncRoot 模式(SyncRoot Pattern)呢? ---- 先上结论: —— 不可能正确实现 SyncRoot 模式 在多线程程序设计中,为了在保证线程安全的同时避免死锁,不应该公开同步锁。 而 ICollection 接口中的 SyncRoot 属性在接口中必然是公开的,于是没有任何途径可以保证调用方不会发生死锁。 于是实现 SyncRoot 的正确方法应该是: —— 避免公开 SyncRoot 属性 所以 SyncRoot 模式应该这样实现: 使用显式接口实现,避免公开暴露此属性 抛出异常,避免调用者使用此属性

    1.2K30发布于 2020-01-08
  • 来自专栏跟着阿笨一起玩NET

    自定义Dictionary支持线程安全

    class SafeDictionary<TKey, TValue> : IDictionary<TKey, TValue> { private readonly object syncRoot </exception> public void Add(TKey key, TValue value) { lock (syncRoot) public ICollection<TKey> Keys { get { lock (syncRoot </exception> public bool Remove(TKey key) { lock (syncRoot) { </exception> public void Add(KeyValuePair<TKey, TValue> item) { lock (syncRoot

    1.2K10发布于 2018-09-19
  • 来自专栏技术/开源

    .net源码分析 – List<T>

    ICollection是集合接口,支持着集合的Count属性和CopyTo操作,另外还有同步的属性IsSynchronized(判断是否线程安全)和SyncRoot(lock的对象)。 IsSynchronized是false,表示并非用SyncRoot 来实现同步。 1 Object System.Collections.ICollection.SyncRoot 2 { 3 get 4 { 5 if (_syncRoot == , new Object(), null); 8 } 9 return _syncRoot; 10 } 11 } SyncRoot通过原子操作得到一个对象,对于 List<T>来说并没有用,对于某些集合比较有用,比如SyncHashtable,就是通过syncRoot来实现线程安全。

    95880发布于 2018-01-04
  • 来自专栏Reck Zhang

    Design Patterns 21 - 单例模式

    多线程时的单例 class Singleton { private static Singleton instance; private static readonly object syncRoot object(); private Singleton() { } public static Singleton GetInstance() { lock(syncRoot 双重锁定 class Singleton { private static Singleton instance; private static readonly object syncRoot } public static Singleton GetInstance() { if(instance == null) { lock(syncRoot

    26830发布于 2021-08-11
  • 来自专栏Danny的专栏

    用两个小例子来解释单例模式中的“双重锁定”

    class Singleton { private static Singleton instance; private static readonly object syncRoot if (instance == null) //若instance对象为null,则继续 { lock (syncRoot

    1.3K30发布于 2018-09-13
  • 来自专栏walterlv - 吕毅的博客

    为什么不应该公开用来同步的加锁对象?为什么不应该 lock(this)/lock(string) 或者 lock 任何非私有对象?

    lock 公开的属性 public class Foo { public object SyncRoot { get; } = new object(); } 只要在 A 处 lock 这个对象的同时 如果你试图实现某些接口中的 SyncRoot 属性,却遇到了上述矛盾(这样的写法不安全),那么可以阅读我的另一篇博客了解如何实现这样的“有问题”的接口: 为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?

    67310发布于 2020-01-08
  • 来自专栏Unity3d程序开发

    C#:数据结构queue队列源码:循环使用数组头标,尾标,防止不停扩容数组

    130 == 1.3, 200 == 2.0 private int _version; [NonSerialized] private Object _syncRoot IsSynchronized { get { return false; } } public virtual Object SyncRoot (ref _syncRoot, new Object(), null); } return _syncRoot; _q = q; root = _q.SyncRoot; } public override bool IsSynchronized { get { return true; } } public override Object SyncRoot

    37120编辑于 2023-08-24
  • 来自专栏james大数据架构

    封装多线程处理大量数据操作

    void SetReturnValue(object obj, object result) { lock (_processResult.SyncRoot SetState(object obj, ProcessState state) { lock (((ICollection)this).SyncRoot public ProcessState GetState(object obj) { lock (((ICollection)this).SyncRoot internal object GetWaitForObject() { lock (((ICollection)this).SyncRoot IsWaitForData(object obj, bool setState) { lock (((ICollection)this).SyncRoot

    1.3K60发布于 2018-01-22
  • 来自专栏Unity3d程序开发

    unity3d:单例模式,Mono场景唯一,不销毁;C# where T:new(),泛型约束;Lua单例模式,table ,self

    class Singleton<T> where T : class,new() { private static T instance; private static object syncRoot { get { if (instance == null) { lock (syncRoot

    73940编辑于 2023-08-24
  • 来自专栏全栈程序员必看

    C#中如何遍历ArrayList

    如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步,例如: ArrayList list = new ArrayList(); //… lock( list.SyncRoot )//当ArrayList为非线程包装的时候,SyncRoot属性其实就是它自己,但是为了满足ICollection的SyncRoot定义,这里还是使用SyncRoot来保持源代码的规范性 { 所以,在枚举的时候,你必须明确使用 SyncRoot 锁定这个集合。 Hashtable与ArrayList关于线程安全性的使用方法类似。

    1.1K20编辑于 2022-09-16
  • 来自专栏喵叔's 专栏

    【地铁上的设计模式】--创建型模式:单例模式(三)--双重检验锁单例

    sealed class Singleton { private static volatile Singleton instance; private static object syncRoot { get { if (instance == null) { lock (syncRoot

    46410编辑于 2023-04-28
  • 来自专栏csico

    C#多线程开发-线程基础 01

    class PepoleCount { private readonly object _syncRoot = new object(); int count = 0; public void AddCount() { lock(_syncRoot) { } } public void DeleteCount() { lock(_syncRoot

    59830发布于 2021-09-03
  • 来自专栏技术博客

    设计模式之一(单例模式)

    class Singleton { private static Singleton instance; private static readonly object SyncRoot 这样不用让线程每次都加锁,保证了线程安全,也提高了性能 if (instance == null) { lock (SyncRoot

    85820发布于 2018-09-11
  • 来自专栏技术博客

    编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]

    早在泛型集合出现之前,非泛型集合一般会提供一个SyncRoot属性,要保证非泛型集合的线程安全,可以通过锁定该属性来实现。 { ///阻止当前线程 autoSet.WaitOne(); lock (list.SyncRoot 可以执行代码 autoSet.Set(); Thread.Sleep(1000); lock (list.SyncRoot

    72841发布于 2018-08-31
  • 来自专栏C#

    C#泛型方法解析

    /// /// <param name="<em>syncRoot</em>">用于对线程安全集合的访问进行同步的对象。 </param><exception cref="T:System.ArgumentNullException"><paramref name="<em>syncRoot</em>"/> 为 null。 /// /// <param name="<em>syncRoot</em>">用于对线程安全集合的访问进行同步的对象。 </param><exception cref="T:System.ArgumentNullException"><paramref name="<em>syncRoot</em>"/> 或 <paramref name /// /// <param name="<em>syncRoot</em>">用于对线程安全集合的访问进行同步的对象。

    4.1K90发布于 2018-01-04
  • 来自专栏Niuery的技术日记

    编码技巧 --- 同步锁对象的选定

    在FCL的早期版本中,一些常用的集合类型(如 ArrayList )提供了公共属性 SyncRoot ,让我们锁定以便进行一些线程安全的操作。 所以你一定会觉得我们刚才的结论不正确。 若 ArrayList 的所有非静态方法都要考虑线程安全,那么 ArrayList 完全可以将这个 SyncRoot 变成静态私有的。 现在它将 SyncRoot 变为公开的,是让调用者自己去决定操作是否需要线程安全。

    39010编辑于 2023-10-22
  • 来自专栏DotNet NB && CloudNative

    编码技巧 --- 同步锁对象的选定

    在FCL的早期版本中,一些常用的集合类型(如 ArrayList )提供了公共属性 SyncRoot ,让我们锁定以便进行一些线程安全的操作。 所以你一定会觉得我们刚才的结论不正确。 若 ArrayList 的所有非静态方法都要考虑线程安全,那么 ArrayList 完全可以将这个 SyncRoot 变成静态私有的。 现在它将 SyncRoot 变为公开的,是让调用者自己去决定操作是否需要线程安全。

    39930编辑于 2023-08-30
  • 来自专栏喵叔's 专栏

    .NET6新东西---TryGetNonEnumeratedCount

    123456; public bool IsSynchronized => throw new NotImplementedException(); public object SyncRoot

    58050编辑于 2021-12-27
  • 来自专栏技术博客

    编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]

    早在泛型集合出现之前,非泛型集合一般会提供一个SyncRoot属性,要保证非泛型集合的线程安全,可以通过锁定该属性来实现。 { ///阻止当前线程 autoSet.WaitOne(); lock (list.SyncRoot 可以执行代码 autoSet.Set(); Thread.Sleep(1000); lock (list.SyncRoot

    59120发布于 2018-09-11
领券