[英]c# why put object in the lock statement
有人可以澄清一下吗:
锁中的语句将被锁定,除非完成并释放锁,否则任何人都无法通过。 那么锁里面的对象是什么
lock (obj)
{
///statement
}
这是否意味着obj已被锁定,除非锁定已完成工作,否则无法在其他任何地方使用obj。
我做了一个非常简单的类来说明锁中的对象是做什么用的。
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 (_transactionLock)
都会被阻止。
第二个锁是lock (_saveLock)
,用于向您显示lock语句中的对象可以标识该锁。 因此,如果一个线程位于lock (_transactionLock)
语句之一中,则没有任何事情可以阻止线程进入lock (_saveLock)
块(除非已经有另一个线程存在)。
阅读有关信号量和监视器的信息。 当涉及多线程时,您希望保护代码的关键部分,以便在对其执行操作时不访问有问题的对象。 关键部分是锁中包含的内容。
这样做都是为了避免死锁和活动锁。 同样,如果您的应用程序是多线程的,则仅需要该锁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.