簡體   English   中英

為什么需要冗余鎖定對象?

[英]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;
        }
    }
}

在上面的示例中,對象thisLocklock關鍵字一起使用。 為什么需要這個? 它似乎沒有任何其他目的。 為什么不單獨擁有lock關鍵字?

lock關鍵字本身不存在,它總是需要一個參數作為信號量(同步對象),只允許一個線程繼續。

http://www.albahari.com/threading/part2.aspx#_Locking

一次只有一個線程可以鎖定同步對象(在本例中為thisLock),並且任何競爭線程都會被阻塞,直到釋放鎖定為止。 如果多個線程爭用鎖定,它們會在“就緒隊列”上排隊,並按照先到先得的原則授予鎖定(需要注意的是Windows和CLR行為的細微差別意味着公平性隊列有時可能會被違反)。

這里有幾個方面:

  • lock語句需要一個對象引用作為標識符。 它必須具有標識此鎖的東西,並將其與代碼中可能存在的任何其他鎖分開。

  • 您要保護的數據不是引用類型,因此您需要使用其他內容作為鎖的標識符。

  • 建議使用僅用作鎖的標識符的私有對象,即使可以使用數據iself作為標識符也是如此。 這樣就沒有理由在類外部公開引用,因為如果它被用在類外的鎖中,就會打開可能的死鎖。

用於鎖定的對象不是多余的。 該對象充當令牌,用於實現簡單的同步協議:持有鎖的任何人都被授予對鎖定代碼的訪問權限。 所有其他人都必須等到鎖被釋放。

如果沒有對象,則不可能有不同的令牌,並且所有同步都依賴於單個內部令牌。 這不會很有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM