【问题标题】:Modification of lock object when another thread has acquired lock on that object当另一个线程获得对该对象的锁定时修改锁定对象
【发布时间】:2013-08-24 04:36:10
【问题描述】:

当一个线程使用 lock(object) 获取一个对象上的锁时,另一个线程是否可以在原始线程仍持有锁的情况下修改该对象?例如:

class SomeObject
{    // For illustration purposes only
     public int a;
     public string b;
}

SomeObject someObject = new SomeObject();

// Thread 1
lock(someObject)
{
.....
}

// 并发线程2:

someObject.a = 10 // 当线程 1 锁定 someObject 时,这会起作用吗?

【问题讨论】:

  • 为什么不自己测试一下?
  • 我认为锁定对象的修改并不重要,只是它被用作锁。另外,您应该从不使用或修改锁定对象。总是做一些扔掉的东西。
  • 使用特殊对象锁定是一个很好的代码约定。
  • 对对象的“锁定”仅提供了一种机制来避免多个线程同时进入这些代码块。在阻止访问或修改方面,它对对象本身什么都不做。编辑:也就是说,如果您 absopositivelysure 您的所有对象修改代码都在 within 那些 lock(someObject){} 块中,那么是的,您只会在获得锁。

标签: c# locking


【解决方案1】:

someObject.a = 10 // 当线程 1 锁定 someObject 时,这会起作用吗?

是的。

如果你愿意,你甚至可以写 someObject = new SomeObject(),不管任何/所有的锁。 lock 关键字主要是 Monitor 类周围的语法糖,它需要(任何)对象引用作为键,对实际对象没有影响。

话虽如此,考虑到线程变得复杂的容易程度和速度,请坚持使用简单的模式:如果您需要代码块的某种同步,只需为此目的显式使用虚拟对象即可。

【讨论】:

  • +1,对象的实例将用作锁的句柄。您应该只将其构造为只读类字段 private readonly objLock = new Object();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多