关于wait(),notify(),notifyAll()

  • 这三个方法,必须在synchronized代码里执行,并且调用的对象或类是synchronized 锁住的对象或者类;
  • 调用notify()或者notifyAll()的对象或者类和调用wait()必须是同一个,才能唤醒调用wait()所在的线程,继续执行wait()后面的代码;
  • 同一个对象或类在多个线程里调用了wait(),同一个对象或类调用notify(),会唤醒其中的某一个线程,notifyAll()会唤醒所有的线程;
  • 对象调用wait()会释放该对象或类的锁,以致让其他地方可以持有(不然其他地方就无法调用wait(),notify(),nofityAll()了,因为synchronized修饰的代码块并未执行完,调用了wait()就相当于停止在这个地方,等待其他地方调用notify()或notifyAll()并走完synchronized修饰的代码块,然后就有机会重新获得锁,继续执行未执行完的代码),notify()和notifyAll()不会释放该对象的锁,需走完synchronized修饰里的代码块才会释放

这三个方法,必须在synchronized代码里执行的例子

 class A {
    public void waitMethod(Object obj) {try {
            synchronized (obj) {
                obj.wait();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public void notifyMethod(Object obj) {
        synchronized (obj) {
            obj.notify();
        }
    }
    public synchronized void waitMethod2() {
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public synchronized void notifyMethod2() {
        this.notify();
    }
    public static synchronized void waitMethod3() {
        try {
            A.class.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static synchronized void notifyMethod3() {
        A.class.notify();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.解决信号量丢失和假唤醒 public class MyWaitNotify3{ MonitorObject m...
    Q罗阅读 4,436评论 0 1
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,938评论 0 62
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 6,623评论 0 14
  • 故事摘抄自《精要主义》 在加利福尼亚州一个阳光明媚的冬日,我去医院看望妻子安娜。虽然身处医院,安娜看起来仍容...
    zx5hlle阅读 4,788评论 0 0
  • EPISODE 2 不被祝福的爱恋·注定的分离 吃完饭,陈老师没有任何挽留,一早把两人赶了出来,还不忘嘱咐朱孝佳早...
    紫上薰阅读 4,172评论 1 51