zoukankan      html  css  js  c++  java
  • java wait()和notify()、notifyAll()

    图见《JAVA并发编程的艺术》P98-101

    这三个方法都是java.lang.Object的方法,用于协调多个线程对共享数据的存取,必须在synchronized语句块中使用!这三个方法最终调用的都是jvm级的native方法,随着jvm运行平台的不同可能有些许差异。

    wait(): Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.

    调用该方法的线程进入Waitting状态,只有notify() 或者 interrupted()方法可以使其返回,wait()会释放Object的琐(相当于离开了synchronized块)

    wait() 方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待队列中。

    其中wait方法有三个overload方法:wait()、wait(long)、wait(long,int)(可以精确到纳秒级) wait方法通过参数可以指定等待的时长。如果没有指定参数,默认一直等待直到被通知。


    notify(): Wakes up a single thread that is waiting on this object's monitor.

    通知一个WaitQueue里的一个线程(JVM确定唤醒哪个线程,而且不是按优先级),使其进入SynchronizedQueue,使其从wait()方法中返回(需要获取Object的琐,即含有notify()的synchronized块结束)


    notifyAll(): Wakes up all threads that are waiting on this object's monitor.

    通知一个WaitQueue里的所有线程,使其进入SynchronizedQueue,使其从wait()方法中返回(需要获取Object的琐,即含有notify()的synchronized块结束)

    notifyAll使所有原来在该对象上等待被notify的线程统统退出waitting的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。

    notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一 个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的 通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

  • 相关阅读:
    ZedBoard学习(6)System Generator实现串口通信(一行HDL代码都不用写)
    ZedBoard学习(1)Ubutun下进行串口通信
    Zedboard学习(7)PS下第一个裸奔程序
    激光雷达(一)数据采集C++
    win7/win8下安装Oracle1出错10g,提示“程序异常终止,发生未知错误”解决方法
    XML文件的加密与解密
    三层中最重要的SqlHelper类
    创建桌面快捷方式的语法
    秋招总结 艾尔夏尔
    thoughtworks二面准备 (三) 艾尔夏尔
  • 原文地址:https://www.cnblogs.com/tonyluis/p/5481420.html
Copyright © 2011-2022 走看看