出于好奇,我们正在查看MSDN上的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;
}
}
}
在上面的示例中,对象thisLock
与lock
关键字一起使用。为什么需要这个?它似乎没有任何其他目的。为什么不单独使用lock
关键字?
答案 0 :(得分:4)
lock
关键字本身不存在,它总是需要一个参数作为信号量(同步对象),只允许一个线程继续。
http://www.albahari.com/threading/part2.aspx#_Locking
只有一个线程可以锁定同步对象(在这种情况下, thisLock)一次,任何竞争线程都被阻塞,直到锁被释放。如果多个线程争用锁,它们就是 在“就绪队列”上排队并按先到先行锁定, 先到先得(一个警告是,行为的细微差别 Windows和CLR有时意味着队列的公平性 被侵犯)。
答案 1 :(得分:0)
这里有几个方面:
lock
语句需要一个对象引用作为标识符。它必须具有标识此锁的东西,并将其与代码中可能存在的任何其他锁分开。
您要保护的数据不是引用类型,因此您需要使用其他内容作为锁定的标识符。
建议使用仅用作锁定标识符的私有对象,即使可以使用数据iself作为标识符也是如此。这样就没有理由在类外面公开引用,因为如果它被用在类外的锁中,就会打开可能的死锁。
答案 2 :(得分:0)
用于锁定的对象不是多余的。该对象充当令牌,用于实现简单的同步协议:持有锁的任何人都被授予对锁定代码的访问权限。所有其他人都必须等到锁被释放。
如果没有对象,就不可能拥有不同的令牌,并且所有同步都依赖于单个内部令牌。这不会很有效。