假设我有以下两种方法:
Object sync = new Object();
…
public void method1() { lock(sync) { … } }
public void method2() { lock(sync) { method1() … }}
我在这里的问题是,这会导致死锁吗?似乎method2在已持有锁同步时正在尝试获取锁同步。
答案 0 :(得分:2)
不,它不会导致任何死锁。 lock
语句将转换为System.Threading.Monitor
Enter
和Exit
调用。 Documentation says:
同一线程多次调用Enter而不阻塞它是合法的;但是,必须等待相等数量的Exit调用,然后其他等待该对象的线程才能解除阻塞。
您两次从同一线程调用lock
,因此不会发生死锁。
答案 1 :(得分:1)
这不会导致死锁,因为从method2到method1的调用将在同一线程上。锁定仅同步跨线程的调用,而不是在同一线程上。 有关更多信息,请参见MS docs。