簡體   English   中英

使用foreach的奇怪的lock()行為

[英]Weird lock() behavior with foreach

所以,這不是我的代碼,並且已縮短以顯示行為,但它給出了非常意外的結果。

我在一個類和一個鎖中有兩個函數

object mylock = new object();
List<string> temp = new List<string>();

Func1(string)
{
  lock(mylock)
  {
    temp.Add(string);
  }
}

Func2()
{
  lock(mylock)
  {
    temp.ForEach(p => Func1(p));
  }
}

現在,我知道這沒有意義,但是當調用Func2時,不應該Func1死鎖嗎? 在我們的例子中,它執行。 謝謝。

不,它不應該死鎖。

如果已經持有鎖的人(如Func2 )調用它,則Func1可以獲得鎖定

鎖定MSDN文檔解釋說:

“在保持互斥鎖定的同時,在同一個執行線程中執行的代碼也可以獲取並釋放鎖定。但是,在鎖定被釋放之前,阻止其他線程中執行的代碼獲取鎖定。”

鎖定的目的是防止不同的線程訪問相同的資源。 Func1Func2同一個線程上

lock語句(封裝Monitor類)支持在線程內重新進入(遞歸),即您可以嵌套使用相同監視器的調用。

其他鎖定方法:

  • Monitor - 支持遞歸
  • ReaderWriterLock - 支持遞歸,但速度很慢
  • ReaderWriterLockSlim - 支持遞歸,但不鼓勵
  • EventHandleManualResetEventAutoResetEventMutexSemaphore ) - 不支持遞歸

.NET Monitor對象(鎖定使用)是遞歸的,因此持有鎖的線程可以自由地再次進入該鎖。

(並非所有鎖定構造都是遞歸的,並且可以針對遞歸支持進行參數化。)

暫無
暫無

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

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