显式锁(四)--- Lock的等待/通知机制Condition
来源:互联网 发布:c语言编程求最简分数 编辑:程序博客网 时间:2024/06/06 04:00
任意一个Java对象,都拥有一组监视器方法(定义在根类Object上),主要包括:wait( )、wait(long timeout)、notify()、notifyAll()方法;这些方法与关键字synchronized结合使用,可以实现 隐式锁的等待/通知机制。而显示锁Lock也实现了等待/通知机制;Condition接口也提供了类似Object的监视器方法,与Lock配合使用可以实现 显式锁的等待/通知机制,但是两者在使用方式和功能特性有所差别。总得来说,Condition接口更加灵活,功能更多:
- Condition 接口是支持多个等待队列,也称为条件队列,即根据不同的条件进入不同的等待队列,相应的,用户便可以只在指定的等待队列上唤醒线程,而不是唤醒所有的线程。而 Object监视器 则只能有一个等待队列。
- Condition 接口还提供了对中断不敏感的等待方法,即当处于等待状态时,是不会被中断的。而Object监视器 不支持不可中断的等待。
- Condition 接口除了提供了超时等待方法之外,还提供了等待直到将来某个时间段的方法;Object监视器只有超时等待的方法。
Condition 接口的方法:
1、其他某个线程调用此 Condition 的 signal()、signalAll()方法;
2、其他某个线程中断当前线程 void awaitUninterruptibly() 造成当前线程在接到通知之前一直处于等待状态。 与await()方法相比,这是不可中断的等待方法 long awaitNanos(long nanosTimeout) throws InterruptedException 造成当前线程在接到通知、被中断或到达指定等待时间之前一直处于等待状态。
返回值:此方法返回时,距离超时的剩余时间,即返回值就是(nanosTimeout - 实际耗时);如果返回值是0或者负数,那么认定已经超时 boolean await(long time, TimeUnit unit) throws InterruptedException 造成当前线程在接到通知、被中断或到达指定等待时间之前一直处于等待状态。
返回值:如果在从此方法返回前检测到等待时间超时(到达指定时间),则返回 false,否则返回 true
此方法在行为上等效于: awaitNanos(unit.toNanos(time)) > 0 boolean awaitUntil(Date deadline) throws InterruptedException 造成当前线程在接到通知、被中断或到达指定最后期限之前一直处于等待状态。
返回值:如果在从此方法返回前检测到等待时间超时(到达指定时间),则返回 false,否则返回 true void signal() 唤醒一个等待线程。如果所有的线程都在等待此条件,则选择其中的一个唤醒。在从 await 返回之前,该线程必须重新获取锁。 void signalAll() 唤醒所有等待线程。 如果所有的线程都在等待此条件,则唤醒所有线程。在从 await 返回之前,每个线程都必须重新获取锁。
@Example Condition 的例子
public class BoundedQueue<T> { private Object[] item; //添加的下标、删除的下标、数组的当前数量 private int addIndex,removeIndex,count; private Lock lock = new ReentrantLock(); private Condition notFull = lock.newCondition(); private Condition notEmpty = lock.newCondition(); public BoundedQueue(int size){ item = new Object[size]; } //添加一个元素,如果数组满,则添加线程进入等待状态,直到有空位 public void add(T t) throws InterruptedException{ lock.lock(); try{ while(count == item.length){ //可中断的等待,如果没有剩余空间,那么就进入notFull的等待队列 notFull.wait(); } item[addIndex] = t; if(++addIndex == item.length){//模拟环数组,一直插入,直到尾部,又重新从头部插入 addIndex = 0; } count++; //刚插入一个元素,不为空的条件满足,可唤醒等待在notEmpty队列上的线程 notEmpty.signal(); }finally { lock.unlock(); } } //从头部移除一个元素,如果数组为空,则等待,直到数组不为空 public T remove(){ lock.lock(); try{ while(count == 0){ //不可中断的等待,不为空的条件不满足,就会一直等待 notEmpty.awaitUninterruptibly();; } Object x = item[removeIndex]; if(++removeIndex == item.length){ removeIndex = 0; } count--; //刚移除一个元素,数组没有满的条件符合,唤醒等待在notFull上的线程 notFull.signal(); return (T)x; }finally{ lock.unlock(); } }}
阅读全文
0 0
- 显式锁(四)--- Lock的等待/通知机制Condition
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
- java5条件阻塞Condition的应用-多路等待通知Lock-Condition使用-笔记整理10
- 多线程(6)等待唤醒机制Lock,condition
- 14.显式的锁机制,显式的等待唤醒机制--lock和condition
- 再谈AbstractQueuedSynchronizer2:共享模式与基于Condition的等待/通知机制实现
- Condition实现生产者消费者模式(等待/通知机制)
- Java的等待通知机制
- 多线程的等待/通知机制
- 如何使用Lock接口来实现等待/通知机制
- java并发编程 之 Condition(等待和通知)
- ReentrantLock(二):正确使用Condition实现等待与通知
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- Java基础 多线程 解决安全问题 等待唤醒机制 Lock Condition interrupt join setPriority yield
- 内置锁(二)--synchronized下的等待/通知机制
- 锁机制:synchronized、Lock、Condition
- java多线程的等待和通知机制
- Unity中Sprite和UI Image的区别
- 爬虫感悟3
- day-11:读取项目中的所有pom.xml文件中所有的version标签
- 初入IT行业,从小白开始
- Android 视图View的基本属性
- 显式锁(四)--- Lock的等待/通知机制Condition
- HTML5
- Vulkan规范:第八章 8.2 ~ 8.3
- Java反射
- 行程长度编码科普
- 文章标题
- [系统安全]使用OD编写连连看外挂
- day-11
- thinkphp5 静态资源文件引入