Monitor 類別提供比 lock 更精細的控制。若僅需基本互斥,lock 足矣;但需鎖超時、非阻塞嘗試等進階功能時,Monitor 是最佳選擇。
if (Monitor.TryEnter(lockObj, 1000))
{
try
{
// 臨界區程式碼
}
finally
{
Monitor.Exit(lockObj);
}
}
else
{
// 超時處理邏輯
}
設定 1 秒超時:若 1 秒內鎖被釋放則返回 true,否則返回 false 進入超時處理分支。
class Program
{
private static Object objA = new Object();
private static Object objB = new Object();
public static void LockA()
{
if (Monitor.TryEnter(objA, 1000))
{
Thread.Sleep(1000);
if (Monitor.TryEnter(objB, 2000))
{
Monitor.Exit(objB);
}
else { Console.WriteLine("LockB timeout"); }
Monitor.Exit(objA);
}
Console.WriteLine("LockA");
}
public static void LockB()
{
if (Monitor.TryEnter(objB, 2000))
{
Thread.Sleep(2000);
if (Monitor.TryEnter(objA, 1000))
{
Monitor.Exit(objA);
}
else { Console.WriteLine("LockA timeout"); }
Monitor.Exit(objB);
}
Console.WriteLine("LockB");
}
public static void Main()
{
Thread threadA = new Thread(LockA);
Thread threadB = new Thread(LockB);
threadA.Start();
threadB.Start();
Thread.Sleep(4000);
Console.WriteLine("線程結束");
}
}
finally 確保異常時也能釋放鎖