Lock 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供一種機制,在不同執行緒間實現程式碼區域的互斥。
public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
- 繼承
-
Lock
備註
此 Lock 類別可用來定義需要程序執行緒間互斥存取的程式碼區域,通常稱為關鍵區段,以防止資源被同時存取。
Lock A 可以進入和退出,其中 Enter 與 exit 之間的代碼區域是與鎖相關的關鍵區段。 進入鎖的線索稱為持有或擁有鎖,直到它離開鎖。 最多只能有一根線同時持有鎖。 一個線可以容納多個鎖。 執行緒可以在離開鎖前多次進入鎖,例如遞迴式。 無法立即進入鎖的執行緒可以等待鎖被輸入或指定的逾時結束。
- 確保執行緒在例外情況下也能以 Even Exit (例如 C# 中)
try/finally使用區塊的方式退出鎖。 - 在 C#
async方法中進出鎖時,確保進入與出口之間沒有await隔閡。 鎖是由執行緒持有,而後續await的程式碼可能會在不同的執行緒上執行。
建議使用 EnterScope 能自動丟棄回傳 Lock.Scope 資料的語言結構,例如 C# using 關鍵字,或使用 C# lock 關鍵字,因為這些方法能確保在特殊情況下鎖會被解除。 這些模式也可能比使用 Enter/TryEnter 和 Exit有性能上的優勢。 以下程式碼片段說明了進出鎖的各種模式。
public sealed class ExampleDataStructure
{
private readonly Lock _lockObj = new();
public void Modify()
{
lock (_lockObj)
{
// Critical section associated with _lockObj
}
using (_lockObj.EnterScope())
{
// Critical section associated with _lockObj
}
_lockObj.Enter();
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
if (_lockObj.TryEnter())
{
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
}
}
}
當使用 C# lock 關鍵字或類似關鍵字來進入和退出鎖時,表達式的類型必須精確 System.Threading.Lock為 。 若表達式的型別為其他形式,例如 Object 或通用型別如 T,則可使用不可互換的其他實作(例如 Monitor)。 欲了解更多資訊,請參閱相關的 編譯器樣本。
Interrupt 可以中斷等待進入鎖的執行緒。 在 Windows STA 執行緒中,等待鎖定允許訊息泵送,讓同一執行緒在等待期間執行其他程式碼。 等待的某些功能可以被自訂 SynchronizationContext覆蓋。
備註
一個進入鎖的執行緒,包括多次進入如遞迴,必須以相同次數退出鎖才能完全退出鎖,並允許其他執行緒進入鎖。 若執行緒在持有 時 Lock退出,該 Lock 行為將變得無法定義。
Caution
如果在某條代碼路徑上,一個執行緒可能在離開前輸入多個鎖,請確保所有可能進入同一執行緒中任兩個鎖的代碼路徑都以相同順序輸入它們。 否則,可能會導致僵局。 舉例來說,假設在一條碼路徑上,執行緒 T1 先進入鎖 L1 再 L2 鎖,然後才退出兩者;在另一條碼路徑上,執行緒 T2 以相反順序進入兩個鎖。 在這種情況下,事件順序可能如下:進入、進入、嘗試進入L2並等待、嘗試進入L1並等待。 T2T1L2T2L1T1 和T2之間存在無法解決的死結T1,未來任何嘗試進入任一鎖的執行緒也會當機。
建構函式
| 名稱 | Description |
|---|---|
| Lock() |
初始化 Lock 類別的新執行個體。 |
屬性
| 名稱 | Description |
|---|---|
| IsHeldByCurrentThread |
會得到一個值,表示該鎖是否被當前執行緒持有。 |
方法
| 名稱 | Description |
|---|---|
| Enter() |
進入鎖,必要時等待鎖被進入。 |
| EnterScope() |
進入鎖,必要時等待鎖被進入。 |
| Equals(Object) |
判斷指定的物件是否等於目前的物件。 (繼承來源 Object) |
| Exit() |
從鎖中出來。 |
| GetHashCode() |
做為預設哈希函式。 (繼承來源 Object) |
| GetType() |
取得目前實例的 Type。 (繼承來源 Object) |
| MemberwiseClone() |
建立目前 Object的淺層複本。 (繼承來源 Object) |
| ToString() |
傳回表示目前 物件的字串。 (繼承來源 Object) |
| TryEnter() |
嘗試不等就進入鎖。 |
| TryEnter(Int32) |
嘗試進入鎖,必要時等待指定的毫秒數,直到能進入鎖。 |
| TryEnter(TimeSpan) |
嘗試進入鎖,必要時等待鎖被進入或指定的超時結束。 |