首頁 >後端開發 >C++ >C#「lock」語句在幕後是如何運作的?

C#「lock」語句在幕後是如何運作的?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-15 09:54:44489瀏覽

How Does the C# `lock` Statement Work Under the Hood?

深入探討 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.Enterlock 語句的功能中扮演著至關重要的角色。 MSDN 將其操作描述如下:

「使用Enter 取得傳遞為參數的物件的Monitor。如果另一個執行緒已經對該物件執行了Enter 但尚未執行對應的Exit,則目前執行緒將阻塞,直到另一個線程釋放該物件。

從本質上講,

保證了對物件的獨佔存取。如果另一個執行緒試圖取得相同的鎖,它將被掛起,直到鎖被釋放。同一執行緒多次呼叫 Monitor.Enter 不會導致阻塞,但需要相同數量的 Enter 呼叫來解鎖物件並允許等待的執行緒恢復執行。 Exit

無限等待時間

值得注意的是,

將無限期地等待鎖可用。與某些鎖定機制不同,它不強制執行逾時時間。 Monitor.Enter

以上是C#「lock」語句在幕後是如何運作的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn