[英]Why is a redundant lock object needed?
出于好奇,我们在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
关键字?
lock
关键字本身不存在,它总是需要一个参数作为信号量(同步对象),只允许一个线程继续。
http://www.albahari.com/threading/part2.aspx#_Locking
一次只有一个线程可以锁定同步对象(在本例中为thisLock),并且任何竞争线程都会被阻塞,直到释放锁定为止。 如果多个线程争用锁定,它们会在“就绪队列”上排队,并按照先到先得的原则授予锁定(需要注意的是Windows和CLR行为的细微差别意味着公平性队列有时可能会被违反)。
这里有几个方面:
lock
语句需要一个对象引用作为标识符。 它必须具有标识此锁的东西,并将其与代码中可能存在的任何其他锁分开。
您要保护的数据不是引用类型,因此您需要使用其他内容作为锁的标识符。
建议使用仅用作锁的标识符的私有对象,即使可以使用数据iself作为标识符也是如此。 这样就没有理由在类外部公开引用,因为如果它被用在类外的锁中,就会打开可能的死锁。
用于锁定的对象不是多余的。 该对象充当令牌,用于实现简单的同步协议:持有锁的任何人都被授予对锁定代码的访问权限。 所有其他人都必须等到锁被释放。
如果没有对象,则不可能有不同的令牌,并且所有同步都依赖于单个内部令牌。 这不会很有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.