0

所以可以说我有这个代码:

public void bar(){
  synchronized(foo){foo.remove(0)}
}

public void doStuff(){
  synchronized(foo){
     bar()
  }
}

同步会意识到我所在的当前链有这个锁并继承它还是会死锁?

4

2 回答 2

5

您从同步块获得的锁是可重入的。这不会死锁,一个线程可以多次获取同一个对象的锁。

请参阅内在锁和同步

于 2012-04-22T14:23:19.580 回答
2

正如马特所说,它不会死锁。

我如何看待它

这种锁定机制不依赖于方法调用,而是依赖于控制流。单个线程如何执行语句以及当线程遇到同步块时,它会在同步签名中请求对象的锁定。

如果有,则进入,否则将在对象的锁池中等待,直到收到通知。

执行 doStuff() 的线程已经携带了锁,所以这就是为什么没有死锁的原因

于 2012-04-22T14:35:24.597 回答