C# 锁定正在使用的私有静态字段

C# 锁定正在使用的私有静态字段,c#,.net,C#,.net,可能重复: 您认为:锁定类中使用的私有静态对象是一种好的做法吗?例如,我有一个包含元素的字典,修改它时我会锁定它(myList)。我更喜欢使用专用的System.Object字段作为锁,但我的同事认为可以使用专用静态字段,因为它已经是专用的。任何一种方法都可以;但是,我更喜欢一个单独的只读静态对象进行同步。这样,它的用途对于您正在执行的锁的类型是显而易见的 如果锁定是为了安全地使用字典或列表,是否考虑过使用System.Generic.Collections.Concurrent对象 另外,您

可能重复:


您认为:锁定类中使用的私有静态对象是一种好的做法吗?例如,我有一个包含元素的字典,修改它时我会锁定它(myList)。我更喜欢使用专用的System.Object字段作为锁,但我的同事认为可以使用专用静态字段,因为它已经是专用的。

任何一种方法都可以;但是,我更喜欢一个单独的只读静态对象进行同步。这样,它的用途对于您正在执行的锁的类型是显而易见的

如果锁定是为了安全地使用字典或列表,是否考虑过使用System.Generic.Collections.Concurrent对象

另外,您是否考虑过ReaderWriterLock?这样,您可以允许多次读取,但安全地锁定,一次只允许一次写入

更多信息

锁定单独的对象与锁定字典本身没有区别。CLR将创建或分配SyncBlock结构并管理锁计数,而不考虑被锁定的对象。更多信息请点击此处:

我的想法是:

字典的职责是存储数据,而不是同步线程。使用一个用于同步的单独对象,将其标记为private readonly,并对其进行适当的命名,以便您知道该成员用于锁定

您和您的队友不太可能对谁锁定了什么以及何时锁定感到困惑。如果字典是双重任务,作为同步对象和字典,那么对于新的队友来说,锁定可能并不明显,锁定在字典上,他们不应该创建新的同步对象

新队友可能不知道dictionary引用作为同步对象和dictionary具有双重责任。该队友可能会试图在类外传递对字典的引用,而字典可能会以意外的方式锁定,从而导致死锁。单独的同步对象可能会导致其他队友停止并重新考虑传递其引用

如果在调用锁之前将该成员标记为readonly并初始化,则可以保证该成员永远不会为null或交换为其他引用


CLR中有一些对象专门用于线程同步。在大多数情况下,SyncLock和Monitor.Enter都很好,但切换到ReaderWriterLock可以获得更好的性能。您不仅可以允许多个线程同时读取,还可以安全地阻止所有线程以允许同步写入。这里有一个简单的例子:

任何一种方法都可以;但是,我更喜欢一个单独的只读静态对象进行同步。这样,它的用途对于您正在执行的锁的类型是显而易见的

如果锁定是为了安全地使用字典或列表,是否考虑过使用System.Generic.Collections.Concurrent对象

另外,您是否考虑过ReaderWriterLock?这样,您可以允许多次读取,但安全地锁定,一次只允许一次写入

更多信息

锁定单独的对象与锁定字典本身没有区别。CLR将创建或分配SyncBlock结构并管理锁计数,而不考虑被锁定的对象。更多信息请点击此处:

我的想法是:

字典的职责是存储数据,而不是同步线程。使用一个用于同步的单独对象,将其标记为private readonly,并对其进行适当的命名,以便您知道该成员用于锁定

您和您的队友不太可能对谁锁定了什么以及何时锁定感到困惑。如果字典是双重任务,作为同步对象和字典,那么对于新的队友来说,锁定可能并不明显,锁定在字典上,他们不应该创建新的同步对象

新队友可能不知道dictionary引用作为同步对象和dictionary具有双重责任。该队友可能会试图在类外传递对字典的引用,而字典可能会以意外的方式锁定,从而导致死锁。单独的同步对象可能会导致其他队友停止并重新考虑传递其引用

如果在调用锁之前将该成员标记为readonly并初始化,则可以保证该成员永远不会为null或交换为其他引用


CLR中有一些对象专门用于线程同步。在大多数情况下,SyncLock和Monitor.Enter都很好,但切换到ReaderWriterLock可以获得更好的性能。您不仅可以允许多个线程同时读取,还可以安全地阻止所有线程以允许同步写入。这里的快速示例:

谢谢您的回答,但我的问题实际上不是关于列表,而是是否保存以锁定类使用的私有静态对象。啊,我明白了。我用更多信息更新了我的答案。基本上,它是安全的,只要你完全知道什么时候锁上什么;但是有一个单独的对象只用于锁定要安全得多,因为它的意图是显而易见的。一个风险是您锁定的对象在内部使用
lock(this)
。这是一段糟糕的代码,但并没有什么可以阻止它,你们通常也不能保证它不会。谢谢你们的回答,但我的问题实际上不是关于列表,而是它是否保存以锁定类使用的私有静态对象。啊,我明白了。我用更多信息更新了我的答案。基本上,只要你是复杂的