public class WaitAndNotify { void method1(Object lock) throws Exception{ synchronized (lock) { lock.wait(); System.out.println("m1"); } } void method2(Object lock) throws Exception{ synchronized (lock) { lock.notify(); Thread.sleep(2000); System.out.println("m2"); } } public static void main(String[] args) throws Exception { final WaitAndNotify w=new WaitAndNotify(); final Object lock=new Object(); new Thread(new Runnable() { public void run() { try { w.method1(lock); } catch (Exception e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { public void run() { try { w.method2(lock); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }
一开始看到代码,想着m2()方法在执行完notify()方法时,m1()方法立刻解除wait()状态,执行下一行代码。
运行之,发现始终是m2()方法的输出代码先执行。
尝试把Thread.sleep()语句注释掉,结果不变。
后查阅资料。得到如下结论:
当m2调用obj.notify/notifyAll的时候,m2正持有obj锁,因此,m1虽被唤醒,但是仍无法获得obj锁。直到m2退出synchronized块,释放obj锁后,m1才有机会获得锁继续执行。
特记之。