当线程使用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锁定某个对象时,这是否可行?
答案 0 :(得分:4)
someObject.a = 10 //当线程1锁定某个对象时,这是否可行?
是。
如果您愿意,甚至可以编写someObject = new SomeObject(),而不管是否有任何/所有锁定。 lock关键字主要是Monitor类的语法糖,它需要一个(任意)对象引用作为键,对实际对象没有影响。
话虽如此,考虑到线程的复杂程度和速度有多快,请坚持使用简单模式:如果需要对代码块进行某些同步,只需为此目的明确使用虚拟对象。