JDK8对并发的新支持
2019独角兽企业重金招聘Python工程师标准>>>
1. LongAdder
- 和AtomicInteger类似的使用方式,但是性能比AtomicLong更好
- 在AtomicInteger基础上进行了热点分离,热点分离类似于有锁操作中的减少锁粒度,将一个锁分离成若干个锁来提高性能。在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能。
- LongAdder原理图:
AtomicLong的实现方式是内部有个value变量,当多线程并发自增,自减时,均通过CAS指令从机器指令级别保证并发的原子性。唯一会制约AtomicLong高效的原因是高并发,高并发意味着CAS的失败几率更高,重试次数更多,越多线程重试,CAS失败几率又越高,变成恶性循环,AtomicLong效率降低。
而LongAdder将把一个value拆分成若干个cell,把所有cell加起来,就是value。所以对LongAdder进行加减操作,只需要对不同的cell来操作,不同的线程对不同的cell进行CAS操作,CAS的成功路当然高了(试想一下3+2+1=6,一下线程3+1,另一个线程2+1,最后是8,LongAdder没有乘法除法的API)。
可是在并发数不是很高的情况,拆分成若干个的cell,还需要维护cell和求和,效率不如AtomicLong的实现。LongAdder用了巧妙的办法来解决了这个问题。
初始情况,LongAdder与AtomicLong是相同的,只有在CAS失败时,才会将value拆分成cell,每失败一次,都会增加cell的数量,这样在低并发时,同样高效,在高并发时,这种"自适应"的处理方式,达到一定cell数量后,CAS将不会失败,效率大大提高。
LongAdder是一种以空间换时间的策略。
2. CompletableFuture
- 实现CompletionStage接口(40余个方法),大多数方法多数应用在函数式编程中
- Java 8中对Future的增强版
- 支持流式调用
简单的实现:
import java.util.concurrent.CompletableFuture; public class AskThread implements Runnable { public AskThread(CompletableFuture<Integer> re) { @Override public static void main(String[] args) throws InterruptedException { |
Future最令人诟病的就是要等待,要自己去检查任务十分完成了,在Future中,任务完成的时间是不可控的。而CompletableFuture的最大改进在于,任务完成的时间也开放了出来:future.complete(60); 用来设置完成时间。
CompletableFuture的异步执行:
public static Integer calc(Integer para) { public static void main(String[] args) throws InterruptedException, |
CompletableFuture的流式调用:
public static Integer calc(Integer para) { public static void main(String[] args) throws InterruptedException, |
组合多个CompletableFuture:
public static Integer calc(Integer para) { public static void main(String[] args) throws InterruptedException, |
这几个例子更多是侧重Java8的一些新特性,这里就简单举个例子来说明特性,就不深究了。CompletableFuture跟性能上关系不大,更多的是为了支持函数式编程,在功能上的增强。当然开放了完成时间的设置是一大亮点。
3. StampedLock
在上一篇中刚刚提出了锁分离,而锁分离的重要的实现就是ReadWriteLock。而StampedLock则是ReadWriteLock的一个改进。StampedLock与ReadWriteLock的区别在于,StampedLock认为读不应该阻塞写,StampedLock认为当读写互斥的时候,读应该是重读,而不是不让写线程写。这样的设计解决了读多写少时,使用ReadWriteLock会产生写线程饥饿现象。
所以StampedLock是一种偏向于写线程的改进。
StampedLock示例:
import java.util.concurrent.locks.StampedLock; public class Point { void move(double deltaX, double deltaY) { // an exclusively locked method double distanceFromOrigin() { // A read-only method |
上述代码模拟了写线程和读线程,StampedLock根据stamp来查看是否互斥,写一次stamp变增加某个值
tryOptimisticRead() |
就是刚刚所说的读写不互斥的情况,每次读线程要读时,会先判断:
if (!sl.validate(stamp)) |
validate中会先查看是否有写线程在写,然后再判断输入的值和当前的stamp是否相同,即判断是否读线程将读到最新的数据。如果有写线程在写,或者stamp数值不同,则返回失败。
如果判断失败,当然可以重复地尝试去读,在示例代码中,并没有让其重复尝试读,而采用的是将乐观锁退化成普通的读锁去读,这种情况就是一种悲观的读法。
stamp = sl.readLock(); |
StampedLock的实现思想:
CLH自旋锁:当锁申请失败时,不会立即将读线程挂起,在锁当中会维护一个等待线程队列,所有申请锁,但是没有成功的线程都记录在这个队列中。每一个节点(一个节点代表一个线程),保存一个标记位(locked),用于判断当前线程是否已经释放锁。当一个线程试图获得锁时,取得当前等待队列的尾部节点作为其前序节点。并使用类似如下代码判断前序节点是否已经成功释放锁
while (pred.locked) { } |
这个循环就是不断等前面那个结点释放锁,这样的自旋使得当前线程不会被操作系统挂起,从而提高了性能。当然不会进行无休止的自旋,会在若干次自旋后挂起线程。
转载于:https://my.oschina.net/u/2484728/blog/893583
JDK8对并发的新支持相关推荐
- Spring4 对Bean Validation规范的新支持(方法级别验证)
Bean Validation standardizes constraint definition, declaration and validation for the Java platform ...
- JDK8那些惊为天人的新特性
分享一波:程序员赚外快-必看的巅峰干货 介绍 随着java的发展,越来越多的企业开始使用 java8 版本.Java8 是自 java5之后最重要的版本,这个版本包含语言.编译器.库.工具.JVM等方 ...
- JDK8的十大新特性
JDK8新特性: 1.Lambda表达式 2.新的日期API 3.引入Optional 4.使用Base64 5.接口的默认方法和静态方法 6.新增方法引用格式 7.新增Stream类 8.注解相关的 ...
- jdk8銝要onematch_JDK8新特性详解 - 纯粹而又极致的光--木九天 - OSCHINA - 中文开源技术交流社区...
简介:JDK8的主要新特性六个:Lambda.Stream.Date.新注解.函数编程.并发,前两者主要用于集合中. JDK8函数编程详解(本篇博客就不介绍了,太多了) 1.Lambda演变过程 @D ...
- JDK8和JDK9【新特性】
一.接口的新特性 概述 jdk8之前接口是规则的集合体,方法只有抽象方法. jdk8版本开始不仅有抽象方法同时增加了带实现的方法. 增加内容 jdk8: 默认方法 default ...
- postgresql 自定义表变量_Oracle GoldenGate新支持开源关系型数据库PostgreSQL
PostgreSQL是一款免费的对象-关系型数据库(ORDBMS),PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询.外键.触发器.视图.事务完整性.多版本并发控制等. ...
- 用料扎实的全模组电源,还有十年换新支持,安钛克HCG 850体验
这两年CPU和显卡的性能越来越强,对电源的要求也越来越高,而且电源本身的使用寿命也要远远长于其他硬件,所以在装机的时候,一定要选一款靠谱的电源,另外为了获得更好的扩展性,全模组的电源显然更值得考虑.目 ...
- 新支持APP 公众号聊天在线客服程序源码
介绍: 本源码不适合纯小白研究 源码全开源 搭建比较繁琐 需要使用一台新服务器! 文章下面有搭建教程 网盘下载地址: http://zijieyunpan.com/sUbyb8TzqcZ0 图片: 这 ...
- NetBeans IDE 6.1增加对BlueJ的新支持
NetBeans/BlueJ开发团队上载了新的支持多语言BlueJ插件,这个插件进入稳定的NetBeans升级中心.因此,不仅提供NetBeans BlueJ版本,并且成为NetBeans IDE 6 ...
最新文章
- 为什么运行了java文件老是404_哪位能帮助一下,JAVA中我运行页面时不能打开,总是出现404错误,为什么;用的是Tomcat7.0,win7的系统,...
- MySQL之concat、concat_ws以及group_concat的使用
- 十年IT运维谈(二)“0”和“100”
- 中国平民百姓与富翁的五大差距
- 字典-字典的增删改查常用操作
- GraphQL query的schema校验
- 透析《长安十二时辰》里的望楼,人类在唐朝就有 5G 愿望了?
- python-解码 decode 报错的问题
- AJAX04 JQ的AJAX
- koa 接口返回数据_koa+node基础搭建到实现api接口
- postman使用之二:数据同步和创建测试集
- 附件 广东省教育系统火灾风险点指南(试行)
- exit()和return的区别
- oracle错误代码03113,Oracle ora-03113错误的处理
- 安装软件后,运行提示:无法正常启动0xc0150002
- java合并两个excel文件内容_java实现多个excel文件合并成一个excel文件
- MATLAB中help的使用
- 如何定义智慧与关于生活的美好 - 与子同 Yue 001
- 什么?HomeKit、米家、Aqara等生态也能通过智汀与天猫精灵生态联动?
- Zuul1与Spring Cloud Gateway的区别