0

当一个线程使用 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 时,这会起作用吗?

4

1 回答 1

4

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

是的。

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

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

于 2013-08-23T20:36:10.957 回答