chapter14_构建自定义的同步工具_3_显式的Condition对象
时间:2019-03-19
本文章向大家介绍chapter14_构建自定义的同步工具_3_显式的Condition对象,主要包括chapter14_构建自定义的同步工具_3_显式的Condition对象使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
-
(1) Condition是一种广义的条件队列
(2) 在java.util.concurrent.locks包中, Condition是一个接口
public interface Condition { void await() throws InterruptedException; void awaitUninterruptibly(); long awaitNanos(long nanosTimeout) throws InterruptedException; boolean await(long time, TimeUnit unit) throws InterruptedException; boolean awaitUntil(Date deadline) throws InterruptedException; void signal(); void signalAll(); }
(3) 如果想编写一个带有多个条件谓词的并发对象, 或者想获得更多对条件队列的控制权, 那么就可以考虑用Condition代替原生条件队列
(4) 一个Condition对象和一个Lock对象关联在一起(就像一个条件队列和一个内置锁关联一样);
但是一个Lock对象可以关联任意数量的Condition对象(通过Lock的Condition newCondition();方法)
(5) Condition对象继承了相关的Lock对象的公平性(如果Lock是公平的, 那么线程会按照FIFO从Condition的await中释放)
(6) wait、notify、notifyAll是Object的方法, 由于Object是所有类的基类, 所以Condition的实现类也有这三个方法. __但是, 使用Condition要用它的await、signal、signalAll方法
-
(1) 示例
@ThreadSafe public class ConditionBoundedBuffer<T> { private static final int BUFFER_SIZE = 100; protected final Lock lock = new ReentrantLock(); // CONDITION PREDICATE: notFull (count < items.length) private final Condition notFull = lock.newCondition(); // CONDITION PREDICATE: notEmpty (count > 0) private final Condition notEmpty = lock.newCondition(); @GuardedBy("lock") private final T[] items = (T[]) new Object[BUFFER_SIZE]; @GuardedBy("lock") private int tail, head, count; // BLOCKS-UNTIL: notFull public void put(T x) throws InterruptedException { lock.lock(); try { while (count == items.length) { notFull.await(); } items[tail] = x; if (++tail == items.length) { tail = 0; } ++count; notEmpty.signal(); } finally { lock.unlock(); } } // BLOCKS-UNTIL: notEmpty public T take() throws InterruptedException { lock.lock(); try { while (count == 0) { notEmpty.await(); } T x = items[head]; items[head] = null; if (++head == items.length) { head = 0; } --count; notFull.signal(); return x; } finally { lock.unlock(); } } }
(2) 这个示例使用Condition, 优点有两个:
-
容易理解: put操作等待的是notFull条件, take操作等待的是notEmpty条件
-
使用signal而非signalAll, 效率高:
之所以敢使用signal, 是因为当前的情境满足了那两个条件(见"2_使用条件队列.md"中的"什么时候可以放心大胆的使用notify"); 而用两个不同的Condition保证了其中一个条件
-
- Ryu:如何在LLDP中添加自定义LLDPDU
- 机器学习|kaggle数据挖掘和求解的基本步骤
- mybatis_generator_逆向工程的使用笔记
- 纳税服务系统总结
- 纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】
- 纳税服务系统三(优化处理)【异常处理、抽取BaseAction】
- 机器学习|快速排序思想求topk
- 纳税服务系统二(用户模块)【POI、用户唯一性校验】
- 纳税服务系统四(角色模块)【角色与权限、角色与用户】
- 纳税服务系统五(登陆与系统拦截)【配置系统、子系统首页、登陆与拦截】
- 纳税服务系统六(信息发布管理模块)【Ueditor、异步信息交互、抽取BaseService、条件查询、分页】
- 纳税服务系统七(投诉管理模块)【显示投诉信息、处理回复、我要投诉、Quartz自动受理、统计图FusionCharts】
- Unikernel初体验
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入探究Immutable.js的实现机制(一)
- 深入探究immutable.js的实现机制(二)
- ES6 Promise 的最佳实践
- 「 Map最佳实践」什么时候适合使用 Map 而不是 Object
- ES2017 异步函数的最佳实践(`async` /`await`)
- React Hooks中这样写HTTP请求可以避免内存泄漏
- 用了这 7 个 VS Code 插件,想写一辈子代码
- 听说你还不知道Promise的allSettled()和all()的区别?
- React 条件渲染最佳实践(7 种方法)
- 一文带你层层解锁「文件下载」的奥秘
- Android实现简单C/S聊天室应用
- Android仿IOS回弹效果 支持任何控件
- 送你一道字节前端原题(Add sumOf)|文末送红宝书
- xadmin使用formfield_for_dbfield函数过滤下拉表单实例
- Python3之外部文件调用Django程序操作model等文件实现方式