在更改字段属性时是否存在锁定字段的问题?

时间:2016-10-25 23:28:50

标签: c# locking

private Foo _Bar;

public Foo Bar
{
  get { return _Bar; }
  set { _Bar = value; }
}

void LockAndReset()
{
   lock(_Bar)
   {
     // Some logic.
     Bar = new Foo();
   }
}

尽管在锁定时属性设置为_Bar字段,但此处如何使用锁定有什么问题吗?使用锁定对象而不是直接锁定字段有什么好处吗?

1 个答案:

答案 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可以同时在锁内执行,因为它们已经抓住了不同的对象来锁定。