Exit方法最後在finally裡調用 ,這樣無論在方法在發生異常、返回還是正常執行,都會執行到finally,並調用 Exit方法解除鎖定。
Monitor類不僅可以完全取代lock語句(如果只使用 lock語句本身的功能,最好還是直接用lock語句吧),還可以使用TryEntry方法 設置一個鎖定超時,單位是毫秒。如下面的代碼所示:
if (Monitor.TryEntry(lockObj,1000))
{
try
{
}
finally
{
Monitor.Exit(lockObj);
}
}
else
{
//超時後的處理代碼
}
上面的代碼設置了鎖定超時時間為1秒,也就是說,在1秒中後, lockObj還未被解鎖,TryEntry方法就會返回false,如果在1秒之內,lockObj被 解鎖,TryEntry返回true。我們可以使用這種方法來避免死鎖,如下面的代碼所 示:
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("線程結束");
}
}