锁在一个简单的属性内-它能死锁吗

本文关键字:属性 死锁 简单 一个 | 更新日期: 2023-09-27 18:08:11

问题:

  1. 我可以死锁此代码吗?IsMouseInside属性是线程安全的吗
  2. copy变量的使用有意义吗

PS:UI线程更新IsMouseInside。另一个线程将读取其值若干次

    public Class Test    
    {
    private readonly object isMouseInsideLocker = new object();
    private bool isMouseInside = false;
    public bool IsMouseInside
    {
        get
        {
            bool copy;
            lock (this.isMouseInsideLocker)
                copy = this.isMouseInside;
            return copy;
        }
        set
        {
            lock (this.isMouseInsideLocker)
                this.isMouseInside = value;
        }
    }
    private void lblProcessTime_MouseEnter(object sender, EventArgs e)
    {
        IsMouseInside = true;
    }
    private void lblProcessTime_MouseLeave(object sender, EventArgs e)
    {
        IsMouseInside = false;
    }
}

锁在一个简单的属性内-它能死锁吗

  1. 不,你不能
  2. 事实并非如此。仅return isMouseInside;

不可以死锁;只有一个锁对象,并且不存在允许您在持有锁时进行一些混乱操作的扩展点。然而,如果您正在使用锁,您可能应该明确您试图避免的场景。虽然其含义实际上非常微妙,但我想知道volatile是否可以在这里工作而不需要任何锁。或者在总是01int上的Interlocked

但可以肯定的是,它看起来会起作用;无论如何,bool总是原子的,所以这里的锁实际上只是作为一个内存屏障来避免缓存问题(因此volatile也可以工作(。记住,任何时候你得到的值,现在都是过时的,可能已经不正确了。不过,从阅读的角度来看,这是真的。

  1. 你不能死锁——你正在锁定同一个对象
  2. 这对我来说没有意义。而且锁定也没有意义——我认为你用它不会取得任何成就

目标是什么?

只有当你有两个不同的锁a和B,两个不同线程试图以不同的顺序获取时,你才能有死锁——因为你只有一个锁,所以你是安全的。

还要记住,C#锁(这是使用Monitor的语法糖(是可重入的-单个线程不能死锁,因为一旦最初获得锁,它就可以随心所欲地重入锁