美文网首页
关于wait(),notify(),notifyAll()

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

作者: 做个文艺的程序猿 | 来源:发表于2017-11-06 18:17 被阅读0次
    • 这三个方法,必须在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();
        }
    }

    相关文章

      网友评论

          本文标题:关于wait(),notify(),notifyAll()

          本文链接:https://www.haomeiwen.com/subject/eoalmxtx.html