c# 解決死鎖問題Monitor


前言

在高並發中,一個很關鍵的問題就是要避免死鎖。

那么為什么會產生死鎖呢?這種情況多見嗎?

舉一個例子:

比如方法一中先lock(object1),在lock(object1)中lock(object2)。

方法二種則相反。

那么這時候可以看出,如果方法一中lock了object1,這時候請求object2。

方法二種lock了object2,這時候請求object1,那么這時候就出現問題了。

這樣解釋不太明白,那么直接看代碼吧。

正文

看下這個吧:

static void Main(string[] args)
{
	object lock1 = new object();
	object lock2 = new object();
	new Thread(() => LockTooMuch(lock1, lock2)).Start();
	lock (lock2)
	{
		Thread.Sleep(1000);
		Console.WriteLine("try to get lock1");
		if (Monitor.TryEnter(lock1, TimeSpan.FromSeconds(5)))
		{
			Console.WriteLine("Acquired a protected resource succesfully");
		}
		else
		{
			Console.WriteLine("Time out  a resource");
		}
	}
	Console.Read();
}

static void LockTooMuch(object lock1, object lock2)
{
	lock (lock1)
	{
		Thread.Sleep(1000);
		lock (lock2) {
			Console.WriteLine("enter lock2");
		};
	}
}

結果:

這個是怎么運行的呢?

主線程獲取lock2,然后分支線程獲取lock1,然后請求lock2。

這時候就堵塞了,可以拿上面代碼運行一下,會堵塞5秒。

這個5秒怎么來的呢?if (Monitor.TryEnter(lock1, TimeSpan.FromSeconds(5))) 這時候是嘗試去獲取lock1,

因為lock1倍分支線程給獲取了,那么獲取不到,這時候等待5秒,5秒后獲取不到就直接走了lese這條路,然后就釋放了lock2,這時候分支線程就繼續運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM