这会起作用还是会导致死锁?
线程1:
synchronized (globalLock) {
synchronized (o) {
o.wait();
}
}线程2(稍后):
synchronized (globalLock) {
synchronized (o) {
o.notify();
}
}所以据我所知,o.wait()会释放o的锁,但是它会释放globalLock的锁吗?可能不会,这会导致死锁吗?
发布于 2015-02-24 08:37:50
正如评论中提到的,这很容易测试。是的,它确实会因为你猜到的原因而死锁。
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();
}发布于 2015-02-24 08:29:47
当线程1在Thread2之前启动时会出现死锁。线程2永远不能执行它的:
synchronized (globalLock)因为线程1从未从synchronized (globalLock)中走出来
https://stackoverflow.com/questions/28686202
复制相似问题