深入探討 lock
語句的內部機制
在處理非執行緒安全性物件時,開發人員經常使用 lock
語句來保護程式碼執行。但是,當多個執行緒與這段受保護的程式碼互動時,底層究竟發生了什麼事?
深入探究:追蹤 lock
語句的執行
在 C# 3.0 中,lock
語句轉換為以下程式碼:
<code class="language-C#">var temp = obj; Monitor.Enter(temp); try { // 非线程安全代码 } finally { Monitor.Exit(temp); }</code>
在 C# 4.0 中,此過程進行了修改,產生的程式碼如下:
<code class="language-C#">bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); // 非线程安全代码 } finally { if (lockWasTaken) { Monitor.Exit(temp); } }</code>
Monitor.Enter
的作用
Monitor.Enter
在 lock
語句的功能中扮演著至關重要的角色。 MSDN 將其操作描述如下:
「使用Enter
取得傳遞為參數的物件的Monitor
。如果另一個執行緒已經對該物件執行了Enter
但尚未執行對應的Exit
,則目前執行緒將阻塞,直到另一個線程釋放該物件。
保證了對物件的獨佔存取。如果另一個執行緒試圖取得相同的鎖,它將被掛起,直到鎖被釋放。同一執行緒多次呼叫 Monitor.Enter
不會導致阻塞,但需要相同數量的 Enter
呼叫來解鎖物件並允許等待的執行緒恢復執行。 Exit
無限等待時間
值得注意的是, 將無限期地等待鎖可用。與某些鎖定機制不同,它不強制執行逾時時間。 Monitor.Enter
以上是C#「lock」語句在幕後是如何運作的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!