注意事项一: 当前线程调用共享对象的wait()方法时,当前线程只会释放当前共享对象的锁,当前线程持有的其他共享对象的监视器锁并不会被释放。
下面举个栗子:
private static volatile Object resourceA = new Object();
private static volatile Object resourceB = new Object();
public static class ResourceA implements Runnable {
@Override
public void run() {
try{
// 获取resourceA的共享资源监视器锁
synchronized (resourceA) {
System.out.println("获取线程A中resourceA的锁");
// 获取resourceB的共享资源的监视器锁
synchronized (resourceB) {
System.out.println("获取线程A中resourceB的锁");
// 线程A阻塞,并释放获取到的resourceA的锁
System.out.println("将线程A挂起,并释放resourceA的锁");
resourceA.wait();
}
}
}