【发布时间】: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){}块中,那么是的,您只会在获得锁。