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

3

我有一部分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.Wait方法在阻塞队列的Dequeue()方法中有对应的Monitor.Pulse方法。
我想要添加一个检查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); } }
}

不应该有任何区别。 - Mitch Wheat
@Mitch:那么使用Flush的唯一原因就是为了使我的代码与Flush属性本身的潜在逻辑更改隔离开来? - Robert Harvey
1个回答

2

个人认为这没有什么区别,但我会选择嵌套版本。我认为,如果使用它实际属性发生了任何变化,使用Flushed可以确保一切正常。

但我真的认为这是个人偏好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接