这会起作用还是导致死锁?
线程1:
synchronized (globalLock) {
synchronized (o) {
o.wait();
}
}
线程2(稍后):
synchronized (globalLock) {
synchronized (o) {
o.notify();
}
}
所以据我所知,o.wait()会释放o的锁,但它会释放globalLock的锁吗?可能不会,这会导致僵局吗?
正如评论中提到的,这非常容易测试。是的,由于你猜测的原因,它确实陷入僵局。
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();
}
线程1在线程2之前启动时出现是死锁。线程2将永远无法执行其:
synchronized (globalLock)
因为线程1从未从synchronized (globalLock)
中出来