当另一个线程获得对该对象的锁定时,修改锁定对象

时间:2013-08-23 20:16:22

标签: c# locking

当线程使用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锁定某个对象时,这是否可行?

1 个答案:

答案 0 :(得分:4)

someObject.a = 10 //当线程1锁定某个对象时,这是否可行?

是。

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

话虽如此,考虑到线程的复杂程度和速度有多快,请坚持使用简单模式:如果需要对代码块进行某些同步,只需为此目的明确使用虚拟对象。