1.Condition实现等待和唤醒线程

java.util.locks.ReentrantLock用于替代synchronized加锁



但是synchronized可以使用wait和notify实现线程在条件不满足时的等待,条件满足时的唤醒。

如何使用ReentrantLock实现wait/notify的功能?

这个时候我们可以使用Condition对象来实现条件不满足时的等待,条件满足时的唤醒。

class TaskQueue{
final Lock lock = new ReentrantLock()
final Condition notEmpty = lock.newCondition();
}

1.1 对Condition对象调用await()方法就相当于对所对象调用wait()方法。


### 1.2 对Condition对象调用signalAll()就相当于在synchronized加锁对象调用notifyAll()方法。

Condition.await/signal/signalAll原理和wait/notify/notifyAll一致
* await()会释放当前锁,进入等待状态
* signal()会唤醒某个等待线程
* signalAll()会唤醒所有等待线程
* 唤醒线程从await()返回后需要重新获得锁

2. 示例

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class TaskQueue{
final Queue<String> queue = new LinkedList<>();
final Lock lock = new ReentrantLock();
final Condition notEmpty = lock.newCondition();
public String getTask() throws InterruptedException{
lock.lock();
try{
while(this.queue.isEmpty()){
notEmpty.await();
}
return queue.remove();
}finally {
lock.unlock();
}
}
public void addTask(String name){
lock.lock();
try{
this.queue.add(name);
notEmpty.signalAll();
}finally {
lock.unlock();
}
}
}
class WorkerThread extends Thread{
TaskQueue taskQueue;
public WorkerThread(TaskQueue taskQueue){
this.taskQueue = taskQueue;
}
public void run(){
while(!isInterrupted()){
String name;
try{
name = taskQueue.getTask();
}catch (InterruptedException e){
break;
}
String result = "Hello, "+name+" !";
System.out.println(result);
}
}
}
public class Main{
public static void main(String[] args) throws InterruptedException{
TaskQueue taskQueue = new TaskQueue();
WorkerThread worker = new WorkerThread(taskQueue);
worker.start();
taskQueue.addTask("Bob");
Thread.sleep(1000);
taskQueue.addTask("Alice");
Thread.sleep(1000);
taskQueue.addTask("Tim");
Thread.sleep(1000);
worker.interrupt();
worker.join();
System.out.println("END");
}
}


## 3. 总结
使用ReentrantLock+Condition可以更安全的实现线程的同步、等待和唤醒。
* Condition可以替代wait/notify
* Condition对象必须从ReentrantLock对象获取
* ReentrantLock+Condition可以替代synchronized+wait/notify

最新文章

  1. svn web页面管理svnadmin部署
  2. EA使用
  3. CSS去除firefox点击链接时的虚线边框
  4. 想要愉快入住酒店?缺了它还真不行!(含PPT)
  5. 【转】“C语言说到底是一门以内存为中心的编程语言” —— 这种说法正确吗?
  6. bzoj 2440: [中山市选2011]完全平方数
  7. ios开发之触碰动画效果
  8. HTML5学习笔记简明版(1):HTML5介绍与语法
  9. iOS之GCD的DEMO
  10. 一个js变量以及其作用域的源码示例
  11. 使用wget下载JDK8
  12. Linux input子系统分析
  13. 关于Mac 系统mysql 乱码问题
  14. linux shell必知必会sed、awk
  15. 微服务框架Lagom介绍之一
  16. NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用
  17. Python测试框架之Unittest梳理
  18. Asp.Net_ 服务端向客户端写JavaScript脚本
  19. ios时间差
  20. 精益软件研发的秘密 IT大咖说 - 大咖干货,不再错过

热门文章

  1. HDU1556-Color the ball-前缀和/线段树/树状数组
  2. 基于pandas数据预处理基础操作
  3. MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
  4. PHP算法之宝石与石头
  5. BCZM : 1.6
  6. leetcode-第10周双周赛-5080-查找两颗二叉搜索树之和
  7. php 三种文件下载的实现
  8. Jupyter notebook文件默认存储路径以及更改方法
  9. thinkphp ajax返回
  10. duilib教程之duilib入门简明教程6.XML配置界面