java8中cas的增强-编程开发技术

java8中cas的增强-编程开发技术

ID:30777478

大小:70.54 KB

页数:6页

时间:2019-01-03

java8中cas的增强-编程开发技术_第1页
java8中cas的增强-编程开发技术_第2页
java8中cas的增强-编程开发技术_第3页
java8中cas的增强-编程开发技术_第4页
java8中cas的增强-编程开发技术_第5页
资源描述:

《java8中cas的增强-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java8中CAS的增强-编程开发技术Java8中CAS的增强原文出处:trytocatch几天前,我偶然地将之询写的用來测试AtomicTnteger和synchronized的自増性能的代码跑了一卜,意外地发现Atomiclntcgcr的性能比synchronized更好了,经过一番原因查找,冇了如下发现:在jdkl.7中,Atomiclnteger的getAndlncrement是这样的:publicfinalintgetAndlncrement(){for(;;){intcurrent=get();intnext=current+1;if(compa

2、reAndSet(current,next))returncurrent;}}publicfinalbooleancompareAndSet(intexpect,intupdate){returnunsafe.compareAndSwapInt(this,valueOffset,expect,update);}而在jdkl.8中,是这样的:publicfinalintgetAndlncrement(){returnunsafe.getAndAddlnt(this,valueOffset,1);}口J以看出,在jdkl.8中,直接使用了Unsafe的getAn

3、dAddlnt方法,而在jdkl.7的Unsafe中,没有此方法。(PS:为了找出原因,我反编译了Unsafe,发现CAS的失败重试就是在getAndAddlnt方法里完成的,我用反射获取到Unsafe实例,编写了跟getAndAddlnt相同的代码,但测试结果却跟jdkl.7的getAndlncrement—样慢,不知道Unsafe里面究竟玩了什么黑魔法,还请高人不吝指点)(补充:文章末尾已有推论)通过查看AtomicTnteger的源码口J以发现,受影响的还冇get/dAdd>addAndGet等大部分方法。有了这次对CAS的增强,我们又多了一个使用

4、非阻塞算法的理由。最后给出测试代码,需要注意的是,此测试方法简单粗暴,compareAndSet的性能不如synchronized,并不能简单地说synchronized就更好,两者的使用方式是存在差异的,而且在实际使用中,还冇业务处理,不可能冇如此高的竞争强度,此对比仅作为一个参考,该测试能够证明的是,AtomicInteger.getAndlncrement的性能有了大幅提升。packageperformanee;importjava・utiI.concurrent・CountDownLatch;importjava・utiI.concurrent・at

5、omic・Atomiclnteger;importjava.util.concurrent.locks.LockSupport;publicclassAtomicTest{//测试规模,调用一次gctAndlncreascX视作提供一次业务服务,记录提供TEST_S1ZE次服务的耗时privatestaticfinalintTEST_SIZE二100000000;//客户线程数—privatestaticfinalintTIIREAD_COUNT=10;//使用CountDownLatch让齐线程同时开始privateCountDownLatchcdl=ne

6、wCountDownLatch(THREADCOUNT+1);_privateintn=0;privatcAtomiclntegerai=newAtomiclntcger(0);privatelongstartTime;publicvoidinit(){startTime=System・nemoTime();}/***使用Atomiclnteger.getAndlncrement,测试结果为1.8比1.7有明显性能提升*@rcturn*/privatefinalintgetAndlncreaseA(){iniresult二ai.getAndTncremenl

7、();if(result==TEST_SIZE){System.out・printin(System・nanoTimc()一startTime);System.exit(0);}returnresult;}/**差别*@return*/privatcfinalintgetAndincrcascB(){intresult;synchronized(this){resuIt二n++;}if(result二二TEST_STZE){Systcni.out.println(Systcm.nanoTime()-startTime);System,exit(0);}ret

8、urnresult;}/***使用Atomiclnt

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。