c#为什么把对象放在lock语句中

时间:2016-06-15 04:51:30

标签: c# multithreading concurrency locking

有人可以澄清我:

锁内的语句将被锁定,除非已完成并释放锁,否则任何人都无法通过。那么用于

的锁内部的对象是什么
lock (obj) 
{ 
  ///statement 
}

这是否意味着obj被锁定,除非锁已完成其工作,否则无法在其他任何地方使用。

2 个答案:

答案 0 :(得分:2)

我做了一个非常简单的类来说明锁中的对象是什么。

public class Account
{
    private decimal _balance = 0m;
    private object _transactionLock = new object();
    private object _saveLock = new object();

    public void Deposit(decimal amount)
    {
        lock (_transactionLock)
        {
            _balance += amount;
        }
    }

    public void Withdraw(decimal amount)
    {
        lock (_transactionLock)
        {
            _balance -= amount;
        }
    }

    public void Save()
    {
        lock (_saveLock)
        {
            File.WriteAllText(@"C:\Balance.txt", _balance.ToString());
        }
    }
}

你会注意到我有三个锁,但只有两个变量。

lock (_transactionLock)相互锁定代码区域只允许当前线程进入 - 这可能意味着当前线程可以重新进入锁定区域。如果线程已经锁定,则无论其中哪个lock (_transactionLock)被攻击,其他线程都会被阻塞。

第二个锁lock (_saveLock)用于向您显示锁定语句中的对象是否用于标识锁定。因此,如果一个线程在lock (_transactionLock)语句之一中,则没有任何东西阻止线程进入lock (_saveLock)块(除非另一个线程已存在)。

答案 1 :(得分:-1)

阅读信号量和监视器。当涉及多线程时,您希望保护代码的关键部分,以便在对其执行操作时不访问相关对象。关键部分是锁在锁内的部分。

这一切都是为了避免死锁和活锁。如果您的应用程序是多线程的,您只需要锁定。