Lit*_*nny 1 c# concurrency multithreading locking
有人可以澄清一下吗:
锁中的语句将被锁定,除非完成并释放锁,否则任何人都无法通过。那么锁里面的对象是什么
lock (obj)
{
///statement
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
您会注意到我有三个锁,但是只有两个变量。
这些行lock (_transactionLock)相互锁定代码区域,仅允许当前线程进入-这可能意味着当前线程可以重新进入锁定区域。lock (_transactionLock)如果某个线程已经具有锁,则无论它们撞到哪个线程,其他线程都会被阻止。
第二个锁lock (_saveLock)在那里向您显示lock语句中的对象在那里标识该锁。因此,如果在其中一个lock (_transactionLock)语句中有一个线程,则没有什么阻止线程进入该lock (_saveLock)块(除非已经有另一个线程)。
| 归档时间: |
|
| 查看次数: |
1364 次 |
| 最近记录: |