关于lock死锁问题
今天面试回来,面试题中有一道题如下:
根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void Test(int i){ lock (this) { if (i > 10) { i--; Test(i); } }} public void Test(int i){ Console.WriteLine("TestLockBegin"); lock (this) { if (i > 10) { i--; Test(i); } } Console.WriteLine("TestLockEnd");} //然后再调用Test(13);var obj = new TA();var input=50;for(var i=0; i<10; i++){ ThreadPool.QueueUserWorkItem(h => { obj.Test(input); });}
[解决办法]
由于出题者过于草率,我们就可以把它往无厘头的方向去想:var obj = new TA();var input = 50;ThreadPool.QueueUserWorkItem(h =>{ lock (obj) while (true) { };});for (var i = 0; i < 4; i++) ThreadPool.QueueUserWorkItem(h => { obj.Test(input); });