代码示例
import java.util.concurrent.TimeUnit;
public class WaitNotify {
public static void main(String[] args) {
final Object A = new Object();
final Object B = new Object();
Thread t1 = new Thread("t1-thread") {
@Override
public void run() {
synchronized (A) {
System.out.println(Thread.currentThread().getName() + "拿到 A 的监视器锁");
System.out.println(Thread.currentThread().getName() + "尝试获取 B 的监视器锁");
try {
System.out.println(Thread.currentThread().getName() + "休眠 2s,不释放 A 的监视器锁");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName() + "挂起自己,释放 A 的监视器锁");
A.wait();
System.out.println(Thread.currentThread().getName() + "被唤醒,等待获取 B 的监视器锁");
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B) {
System.out.println(Thread.currentThread().getName() + "拿到 B 的监视器锁");
B.notify();
}
}
}
};
Thread t2 = new Thread("t2-thread") {
@Override
public void run() {
synchronized (B) {
System.out.println(Thread.currentThread().getName() + "拿到 B 的监视器锁");
System.out.println(Thread.currentThread().getName() + "尝试获取 A 的监视器锁");
synchronized (A) {
System.out.println(Thread.currentThread().getName() + "拿到 A 的监视器锁");
try {
System.out.println(Thread.currentThread().getName() + "休眠 2s,不释放 A 的监视器锁");
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "挂起自己,释放 A 的监视器锁,唤醒 t0");
A.notify();
}
try {
System.out.println(Thread.currentThread().getName() + "休眠 2s,不释放 B 的监视器锁");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName() + "挂起自己,释放 B 的监视器锁");
B.wait();
System.out.println(Thread.currentThread().getName() + "被唤醒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t1.start();
t2.start();
}
}
执行结果
t1-thread拿到 A 的监视器锁
t2-thread拿到 B 的监视器锁
t1-thread尝试获取 B 的监视器锁
t2-thread尝试获取 A 的监视器锁
t1-thread休眠 2s,不释放 A 的监视器锁
t1-thread挂起自己,释放 A 的监视器锁
t2-thread拿到 A 的监视器锁
t2-thread休眠 2s,不释放 A 的监视器锁
t2-thread挂起自己,释放 A 的监视器锁,唤醒 t0
t2-thread休眠 2s,不释放 B 的监视器锁
t1-thread被唤醒,等待获取 B 的监视器锁
t2-thread挂起自己,释放 B 的监视器锁
t1-thread拿到 B 的监视器锁
t2-thread被唤醒
网友评论