有人可以澄清我:
锁内的语句将被锁定,除非已完成并释放锁,否则任何人都无法通过。那么用于
的锁内部的对象是什么lock (obj)
{
///statement
}
这是否意味着obj被锁定,除非锁已完成其工作,否则无法在其他任何地方使用。
答案 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)
阅读信号量和监视器。当涉及多线程时,您希望保护代码的关键部分,以便在对其执行操作时不访问相关对象。关键部分是锁在锁内的部分。
这一切都是为了避免死锁和活锁。如果您的应用程序是多线程的,您只需要锁定。