This question already has answers here:
Why is lock(this) {…} bad?

(16 个回答)


7年前关闭。




我正在尝试在 C# 中学习线程,我在几篇文章中看到了一些内容,但我不确定我是否完全理解它:
在给定的两个示例中,获取“this”与“thisLock”锁定之间的根本区别是什么。

示例 1:
class Account
    {
        decimal balance;
        private Object thisLock = new Object();

        public void Withdraw(decimal amount)
        {
            lock (thisLock)
            {
                if (amount > balance)
                {
                    throw new Exception("Insufficient funds");
                }
                balance -= amount;
            }
        }
    }

示例 2:
class Account
    {
        decimal balance;

        public void Withdraw(decimal amount)
        {
            lock (this)
            {
                if (amount > balance)
                {
                    throw new Exception("Insufficient funds");
                }
                balance -= amount;
            }
        }
    }

根据我的理解,我认为“thisLock”只会阻止其他线程进入该特定代码区域。

锁定“this”是否会停止对该对象的所有操作,即其他线程对其他方法的调用?

我是否从根本上错过了理解这一点,或者这是正确的结论?

最佳答案

这两种情况将产生完全相同的效果。一个区别是其他对象看不到 thisLock ,因此您可以确定没有其他对象会重用锁。如果锁定 this ,另一部分代码也可以锁定 Account 的同一实例。

关于c# - 使用对象获取锁,而不是这个 - 线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20352287/

10-17 00:17