这会起作用还是导致死锁?
主题1:
synchronized (globalLock) {
synchronized (o) {
o.wait();
}
}
主题2(稍后):
synchronized (globalLock) {
synchronized (o) {
o.notify();
}
}
所以根据我的理解,o.wait()将释放o的锁,但它会释放globalLock的锁吗?可能不会,这会导致僵局?
答案 0 :(得分:1)
线程1在Thread2之前启动时是死锁。 线程2将永远无法执行其:
synchronized (globalLock)
因为线程1从未出现过synchronized (globalLock)
答案 1 :(得分:1)
正如评论中所提到的,这很容易测试。是的,由于您猜到的原因,它确实陷入僵局。
public static void main(String[] args) throws InterruptedException {
final Object globalLock = new Object();
final Object o = new Object();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (globalLock) {
synchronized (o) {
try {
System.out.println("waiting");
o.wait();
} catch (InterruptedException ie) {
// no-op
}
}
}
}
}).start();
Thread.sleep(2000); // ensure thread above starts first
new Thread(new Runnable() {
@Override
public void run() {
synchronized (globalLock) {
synchronized (o) {
System.out.println("notifying");
o.notify();
}
}
}
}).start();
}