以下代码,在Lock里面使用递归操作,是否会造成死锁问题??该问题也是很多coder在面试时经常会碰到的问题,在此做下笔记,不懂的coder也可以顺便了解下,确保面试不再因此碰壁。
1 public class A 2 { 3 private object obj = new object(); 4 public void Test(int i) 5 { 6 lock (obj) 7 { 8 if (i > 10) 9 { 10 i--; 11 Test(i); 12 } 13 else 14 { 15 Console.WriteLine(i); 16 } 17 } 18 } 19 } 20 21 class Program 22 { 23 static void Main(string[] args) 24 { 25 A a = new A(); 26 a.Test(15); 27 Console.ReadKey(); 28 } 29 }
答案:否。
原因是什么呢?我们先来看看Lock的定义:
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放
由定义可知,Lock的本质是针对于多线程的,上面代码中这个锁属于自己线程所有,在属于自己的线程中无须等待对象被释放即可进入临界区,进行任意操作。