private Foo _Bar;
public Foo Bar
{
get { return _Bar; }
set { _Bar = value; }
}
void LockAndReset()
{
lock(_Bar)
{
// Some logic.
Bar = new Foo();
}
}
尽管在锁定时属性设置为_Bar
字段,但此处如何使用锁定有什么问题吗?使用锁定对象而不是直接锁定字段有什么好处吗?
答案 0 :(得分:2)
是的,有问题:
线程1带有_Bar = BarA
void LockAndReset()
{
lock(_Bar)
{
Bar = new Foo();
}
}
线程2带有_Bar = BarA
。线程2被阻塞,直到线程1完成。
主题1设置Bar = new Foo();
(_Bar = BarB
)
现在,在线程1执行Bar = new Foo();
之后,线程3进入。它现在锁定在BarB
。
这意味着线程2和线程3可以同时在锁内执行,因为它们已经抓住了不同的对象来锁定。