[英]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.