锁定一个简单的属性 - 它可以死锁吗?

时间:2011-09-11 22:38:11

标签: c# locking deadlock

问题:

  1. 我可以将此代码解锁吗? IsMouseInside属性是否是线程安全的?
  2. 复制变量的使用是否有意义?
  3. 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;
        }
    }
    

4 个答案:

答案 0 :(得分:3)

  1. 不,你不能。
  2. 没有。只需return isMouseInside;

答案 1 :(得分:2)

不,不能死锁;只有一个锁定对象,并且不存在允许您在保持锁定时执行某些操作的扩展点。但是,如果您使用锁定,则应该清楚地说明您要避免使用哪些方案。虽然含义实际上非常微妙,但我想知道volatile是否可以在这里工作而不需要任何锁定。或Interlocked上的int始终为01

但是可以肯定的是,看起来它会起作用;无论如何bool始终是原子的,所以这里的锁只是作为一个内存屏障避免缓存问题(因此volatile也可能起作用)。请记住,无论何时获得该值,现在都已过时并且可能已经不正确。但是在阅读时确实如此。

答案 2 :(得分:1)

  1. 你不能死锁 - 你锁定了同一个对象。
  2. 对我来说没有意义。锁定没有意义 - 我不认为你用它做任何事情。
  3. 目标是什么?

答案 3 :(得分:0)

如果你有两个不同的锁A和B,两个不同的线程试图以不同的顺序获取,你只能有一个死锁 - 因为你这里只有一个锁是安全的。

还要记住,C#lock(使用Monitor的语法糖)是reentrant - 单个线程无法死锁,因为它可以重新输入锁定次数它最初获得了它。

相关问题