我如何安全地锁定这个属性?

时间:2011-08-06 03:29:13

标签: c# multithreading locking nested

我有一个阻塞队列的部分C#代码,如下所示:

private bool flushed;
private object _locker = new object();

public bool Flushed
{
    get { lock (_locker) { return flushed; } }
    set
    {
        lock (_locker)
        {
            flushed = value;
            Monitor.Pulse(queue);
        }
    }
}

Monitor.Pulse方法在阻塞队列的Monitor.Wait方法中具有Dequeue()对应方。

我想添加一个信号结束信号的方法,检查Flush条件。它看起来像这样:

public bool EndOfData
{
    get { lock (_locker) { return Flushed && (queue.Count == 0); } }
}

这是我的问题。 我应该如上面的代码所示调用Flushed属性(采用嵌套的lock),还是直接引用私有成员变量flushed就足够了,如图所示下面,只使用一个锁吗?

public bool EndOfData
{
    get { lock (_locker) { return flushed && (queue.Count == 0); } }
}

1 个答案:

答案 0 :(得分:2)

我不认为它有所作为,我个人会使用嵌套版本。 我认为如果使用它Flushed,实际属性发生了任何变化,你确定 一切都很好。

但我真的相信这是一个偏好电话。