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

Dea*_*ine 5 .net c# multithreading asynchronous

这是我从未理解过的.lock像示例一样,创建一个被编辑的虚拟对象几乎就像是一个黑客

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;  
        }  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

来自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;  
        }  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

会等同吗?

ruc*_*mzu 7

传递的实例lock用于识别关键部分.

您的代码中可能包含任意数量的不相关的关键部分,每个部分都将锁定不同的对象.无参数lock语句与您建议的语句类似,无法区分许多关键部分.

编辑

虽然看起来很明显,但值得注意的是,每个需要进入给定临界区的部分都必须能够访问被锁定的对象.所以这不是在lock声明之前和之内创建任意实例的问题.