如何安全地锁定此属性

本文关键字:锁定 属性 安全 何安全 | 更新日期: 2023-09-27 18:04:35

我有一个阻塞队列的部分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方法在阻塞队列的Dequeue()方法中有对应的Monitor.Wait方法。

我想添加一个信号数据结束的方法,该方法检查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); } }
}

如何安全地锁定此属性

我不认为这有什么区别,我个人会使用嵌套版本。我认为,如果使用Flushed,实际属性发生任何变化,您可以确保一切就绪。

但我真的相信这是一个偏好呼叫。