所以可以说我有这个代码:
public void bar(){
synchronized(foo){foo.remove(0)}
}
public void doStuff(){
synchronized(foo){
bar()
}
}
同步会意识到我所在的当前链有这个锁并继承它还是会死锁?
您从同步块获得的锁是可重入的。这不会死锁,一个线程可以多次获取同一个对象的锁。
请参阅内在锁和同步。
正如马特所说,它不会死锁。
我如何看待它
这种锁定机制不依赖于方法调用,而是依赖于控制流。单个线程如何执行语句以及当线程遇到同步块时,它会在同步签名中请求对象的锁定。
如果有,则进入,否则将在对象的锁池中等待,直到收到通知。
执行 doStuff() 的线程已经携带了锁,所以这就是为什么没有死锁的原因