Java中wait()及notify()小记

有代码如下,猜猜输出结果:
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才有机会获得锁继续执行。
特记之。

猜你喜欢

转载自leozam.iteye.com/blog/2384717
今日推荐