c# - 为什么我们需要在 C# 中锁定和对象?

标签 c# .net multithreading asynchronous

这是我一直不明白的事情。创建一个被锁定的虚拟对象,就像这个例子

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;  
        }  
    }  
}  

来自 https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx .

为什么语言设计者不能做到这一点

class Account  
{  
    decimal balance;   

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

是等价的吗?

最佳答案

传递给 lock 的实例用于识别临界区

您的代码中可能有任意数量的不相关关键部分,每个关键部分将锁定不同的对象。一个无参数的 lock 语句,就像你建议的那样,将无法区分许多关键部分。

编辑

虽然这看起来很明显,但值得注意的是,需要进入给定关键部分的每个部分都必须能够访问锁定的对象。因此,这不是在 lock 语句之前和在同一范围内创建任意实例的问题。

关于c# - 为什么我们需要在 C# 中锁定和对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40444044/

相关文章:

c# - 多线程求和给出不正确的结果

c# - 在命令行参数中传递新行?

c# - 如何在 C# 中使用 Aforge.NET 和 ZXing.NET 从 WebCamera 解码 QRCode

c# - C# 赋值变量时的异常处理

c# - 是否有使用 NUnit 测试复杂函数的通用方法?

c# - 一旦线程的功能范围结束,它是否会自行停止?

python - 为什么将 list() 包裹在 map 周围会导致函数运行?

c# - 如何为 DateTime 参数设置默认值

c# - Foreach 循环中的 Entity Framework 事务

.net - JSON.NET : serializing/deserializing arrays