等待/通知的目的是确保等待线程从wait()方法返回时能够感知到通知线程对变量所做出的的修改;

等待方遵循如下原则:

1.获取对象的锁

2.如果条件不满足,那么调用对象的wait()方法,被通知后任要检查条件

3.条件满足则进行对于的逻辑

伪代码如下:

 synchronized(对象) {
while (条件不满足) {
对象.wait();
} 对应的逻辑;
}

  

通知方遵循如下原则:

1.获得对象的锁

2.改变条件

3.通知所有等待在对象上的线程

对应的伪代码如下:

 synchronized(对象) {
改变条件
对象.notifyAll();
}

  

需要注意

1.使用wait(),notify()和notifyAll()时需要先调用对象加锁

2.使用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列

3.notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifyAll()的线程释放锁之后,等待线程才会有机会从wait()返回

4.notify()方法将等待队列中的一个等待线程从等待队列中移动到同步队列,而notifyAll()方法则时将等待队列中所有的线程全部移到同步队列,被移动的线程的状态由WAITING变为BLOCKED;

5.从wait()方法返回的前提是获得了所有调用对象的锁

等待超时模式

假设超时时间段时T,那么可以推断在当前时间 now + T之后就好超时;

定义如下变量:

  • 等待持续时间:REMAINING = T

  • 超时时间:FUTURE = now + T

这时仅需要wait(REMAINING) 即可,在wait(REMAINING)返回之后将会执行:REMAINING = FUTURE - now;如果REMAINING 小于等于0,表示已经超时,直接退出,否则将继续执行wait(REMAINING);

伪代码如下:

 public synchronized Object get(long mills) throw InterruptedException {
long future = System.currentTimeMillis() + mills;
long remaining = mills; //当超时大于0并且result返回值不满足要求
while ((result == null) && remaining > 0) {
wait(remaining);
remaining = future - System.currentTimeMillis();
} return result;
}

  

最新文章

  1. ASP.NET MVC——模型绑定
  2. 虚拟IP(VIP)
  3. js的client详解
  4. OC-self关键字
  5. oracle简历自增序列(转)
  6. SQLite存储类(数据类型)
  7. DP入门---饭卡
  8. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
  9. 编译安装-MySQL5.5
  10. jQuery将字符串转换成json
  11. js设置奇偶行数样式
  12. HDU - 4944 FSF’s game
  13. Code Review中的几个提示
  14. struts2运行过程(图解)
  15. canvas绘制多边形
  16. PhpStorm代码提示(省电模式)的设置与使用
  17. ArcGIS for qml - 地址地标转换为经纬度(地理编码)
  18. 第八单元 正文处理命令及tar命令
  19. 卷积神经网络(CNN)代码实现(MNIST)解析
  20. Android学习之Button按钮在程序运行时全部变大写的处理

热门文章

  1. 自己实现一个 DFA 串模式识别器(二)
  2. 关于window服务器中新建的普通用户无法登录远程桌面
  3. CountDownLatch、CyclicBarrier
  4. pwnable.kr-shellshock-witeup
  5. 普转提Day2
  6. mysql及联合查询
  7. mybatis进行mapper.xml测试的时候发生"必须为元素类型 “mapper” 声明属性 “namespace”
  8. 万字长文 | 23 个问题 TCP 疑难杂症全解析
  9. Centos-rpm二进制包安装-rpm
  10. 三级菜单打怪升级,young -> plus -> pro