java - wait(),notify(),notifyAll() T2 start! T2 end! T1 start! 为什么会阻塞
问题描述
public class Thread04 { final Object object = new Object();Runnable rb4 = new Runnable() { public void run(){synchronized (object){System.out.println('T1 start!');try { object.wait();} catch (InterruptedException e) { e.printStackTrace();}object.notify();System.out.println('T1 end!'); }}};Runnable rb5 = new Runnable() { public void run(){synchronized (object){ System.out.println('T2 start!'); object.notify(); System.out.println('T2 end!'); }}};public static void main(String[] args) {Thread04 th = new Thread04();new Thread(th.rb4).start();new Thread(th.rb5).start(); } }
问题解答
回答1:rb5 的 object.notify(); 调用时 rb4 还没有进入 wait 状态,因为还在等待锁。线程 start 并不代表马上会自行 run(),也就是说后 start() 的线程的 run() 很有可能先执行。
回答2:rb4在运行获得object的对象锁,输出T1 start!,然后调用wait(),该方法会让rb4挂起,同时释放锁,阻塞。 这时候rb5获得锁,输出T2 start!。然后调用object.notify();,虽然这里打算让rb4运行,但是rb5的锁并没有释放,所以rb4还是处于阻塞。 rb5还是继续运行,输出T2 end!。 rb5运行结束,释放锁, rb4运行输出T1 end!。
相关文章: