应该在属性上使用同步锁吗?

Net*_*ppy 3 c# multithreading properties synclock

我一直在阅读周围的内容,并得到了关于我是否应该在属性上使用同步锁的相互矛盾的答案。

我有一个多线程应用程序,需要跨线程获取/设置实例对象的属性。目前它是在不使用同步锁的情况下实现的,到目前为止我还没有注意到任何问题。我在常见的静态方法上使用同步锁,但我想以线程安全的方式正确实现我的实例类。

任何反馈将不胜感激。

Jef*_*tin 5

一个好的经验法则是,如果满足以下任何条件,则需要锁定:

  • 如果要在多个线程上修改对象的任何字段
  • 如果任何修改涉及访问多个字段
  • 如果任何可修改字段是 Double、Decimal 或结构化值类型
  • 如果任何修改涉及读取-修改-写入(即添加到字段或使用另一个字段的值设置一个字段)

那么您可能需要锁定访问这些字段的每个方法或属性。

编辑:请记住,类内部的锁定很少是足够的——您需要做的是确保在整个逻辑操作范围内不会出错。

正如 @Bevan 指出的,如果调用代码需要多次访问一个对象,则客户端代码应该在其整个工作期间取出自己对该对象的锁定,以确保另一个线程不会“介入”它的访问并弄乱了它的逻辑。

您还需要注意,如果有任何事情需要一次取出多个锁,则它们始终以相同的顺序取出。如果线程 1 拥有实例 A 上的锁并尝试锁定实例 B,而线程 2 拥有实例 B 上的锁并尝试获取实例 A 上的锁,则两个线程都会被卡住而无法继续执行 - 就会出现死锁。