大多數的死鎖都是因為代碼允許以不一致的方式鎖定資源。例如我們要將一個賬戶的資金轉到另一個賬戶中。Monitor類提供同步對對象的訪問的機制。類通過向單個線程授予對象鎖來控制對對象的訪問。對象鎖提供限制訪問代碼塊(通常稱為臨界區)的能力。當一個線程擁有對象的鎖時,其他任何線程都不能獲取該鎖。還可以使用Monitor來確保不會允許其他任何線程訪問正在由鎖的所有者執行的應用程序代碼節,除非另一個線程正在使用其他的鎖定對象執行該代碼。示例代碼如下:
public void Transer(Account accFrom, Account accTo, decimal num)
{
Monitor.Enter(accFrom);//鎖定賬戶一
Monitor.Enter(accTo);//鎖定賬戶二
//業務代碼。。。
Monitor.Exit(accFrom);//釋放賬戶一
Monitor.Exit(accTo);//釋放賬戶二
}
而這個時候有兩個線程,線程一和線程二試圖以不同的順序獲得相同的資源,每個線程都在鎖定兩個資源前先行鎖定了一個,此時就會出現死鎖現象。
解決方法就是鎖定執刑的代碼。例如:
lock(this)
{
//Monitor語句
}