多线程如何确保在另一个线程的obj.notify()执行之前,当前线程已经执行了obj.wait()?

如果线程的wait比notify先执行,那么程序就死了,怎么才能解决这个问题?

public class AaaTest {
    public static void main(String[] args) throws InterruptedException {
        Object obj=new Object();
        Ttt ttt=new Ttt(obj);
        ttt.start();
        synchronized(obj){
            obj.wait();
        }
        System.out.println("wait先执行,程序通过");
    }
    static class Ttt extends Thread{
        Object obj;
        Ttt(Object obj){
            this.obj=obj;
        }
        public void run() {
            synchronized(obj){
                    obj.notify();
            }
        }
    }
}

这样是否能够100%保证 obj.wait(); 在 obj.notify(); 之前执行?

阅读 3.3k
2 个回答

当然不能!
因为哪个线程先进入同步块是不确定的。

main方法可以这样改:

synchronized(obj) {
    ttt.start();
    obj.wait();
}

这样可以保证ttt线程即使先于obj.wait()方法执行,也无法进入同步块。

不能,主线程还是ttt线程,那个先进入同步块synchronized(obj){}无法保证,楼上正解

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题