簡體   English   中英

c#為什么將對象放在lock語句中

[英]c# why put object in the lock statement

有人可以澄清一下嗎:

鎖中的語句將被鎖定,除非完成並釋放鎖,否則任何人都無法通過。 那么鎖里面的對象是什么

lock (obj) 
{ 
  ///statement 
}

這是否意味着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());
        }
    }
}

您會注意到我有三個鎖,但是只有兩個變量。

lock (_transactionLock)lock (_transactionLock)相互鎖定代碼區域,僅允許當前線程進入-這可能意味着當前線程可以重新進入鎖定區域。 如果其他線程已經擁有該鎖,則無論它們碰到了哪個lock (_transactionLock)都會被阻止。

第二個鎖是lock (_saveLock) ,用於向您顯示lock語句中的對象可以標識該鎖。 因此,如果一個線程位於lock (_transactionLock)語句之一中,則沒有任何事情可以阻止線程進入lock (_saveLock)塊(除非已經有另一個線程存在)。

閱讀有關信號量和監視器的信息。 當涉及多線程時,您希望保護代碼的關鍵部分,以便在對其執行操作時不訪問有問題的對象。 關鍵部分是鎖中包含的內容。

這樣做都是為了避免死鎖和活動鎖。 同樣,如果您的應用程序是多線程的,則僅需要該鎖。

暫無
暫無

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

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