欢迎来到天天文库
浏览记录
ID:30768860
大小:99.16 KB
页数:5页
时间:2019-01-03
《java延时实例分析:lockvssynchronized-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java延时实例分析:LockvsSynchronized-编程开发技术Java延时实例分析:LockvsSynchronized本文illImportNew-paddx翻译自javacodegeeks«欢迎加入翻译小组。转载诘见文末要求。这篇文章通过实例讨论了:-java,concurrent.Lock创建的垃圾-比较Lock和synchronized-如何通过编程方式计算延时-Lock和synchronized竞争带来的影响-延迟测试屮由于遗漏(co-ordinatedomission)可能对结果的影响冋到我最喜欢的一个主题:垃圾的创建与分配。可以从我以前的文章(如
2、:性能优化的首要法则和重视性能优化首要法则:逃逸分析的效果)获取更多关于这个议题的细节。尤其弄懂在性能问题上,为什么分配是如此重要的因索。几天前,当我诊断一些JIT编译期间奇怪的分配问题时,发现java.util,concurrent,locks.ReentrantLock的分配有问题,不过这只在竞争条件下出现。(这一点很容易证明,只要运行一个在Lock上建立竞争并指定-verbosegc参数测试程序(类似下面的程序))。示例是在有Lock竞争时GC的输出结果:[GC(AllocationFailure)[GC(AllocationFailure)[GC(Allocat
3、ionFailure)[GC(AllocationFa订ure)[GC(AllocationFailure)[GC(AllocationFailure)[GC(AllocationFailure)[GC(AllocationFailure)[GC(AllocationFailure)16384K-〉1400K(62976K),17784K->1072K(62976K),17456K->1040K(62976K),17424K->1104K(62976K),17488K->1056K(61952K),17440K->1024K(61952K),17408K->1161K(
4、61952K),17545K->1097K(61440K),16969K->1129K(61952K),0.0016854secs]0.0011939secs]0.0008452secs]0.0008338secs]0.0008799secs]0.0010529secs]0.0012381secs]0.0004592secs]0.0004500secs][GC(AllocationFailure)17001K->1129K(61952K),0.0003857secs]我怀疑是否是在垃圾回收时必须对清理Lock上分配的空间,在高度竞争的环境下,将会选择一种比内建的'syn
5、chronized'更坏的同步策略。当然,这个问题比其他任何问题都更加学术。如呆你确实非常关心延迟,你会发现自己从来不会(或者绝不应该)有这样一种情况会需要这么多的线程锁。不过,请继续跟我-起探究这个问题,因为这个过程和结果都非常有趣。简史:锁是2004年,在Java1.5中引入的。由于对简单并发结构的迫切需要,锁以及其他并发工具因此而诞生。在这Z前,你不得不通过内建的synchronized和Object的wait()>notify()方法来控制并发。ReentrantLock提供许多比synchronized更好的功能,下面是一些例子:•变得非结构化——比如,不会受
6、块或方法的限制,允许你跨多个方法持有锁。•轮询锁•等待锁超时•配置失败策略但是它们在延迟测试屮有什么作用呢?我写了一个简单的测试来比较Lock和synchronized的性能。这段代码允许改变线程的数量(1个线程意味着不存在竞争)及竞争的数量。通过有遗漏(coordinatedomission)和没有遗漏來衡量。采用Lock或者synchronised来运行测试。为了记录结果,我使用了Histogram类。该类是PeterLawrey创建的。你可以在Chronicle-Core的工具类中找到该类。importorg.junit.Test;importjava・uti1.
7、concurrcnt.locks・Lock;importjava・uti1.concurrent.locks・ReentrantLock;publicclassLockVsSync{privatestaticfinalbooleanC00RDTNATED_0MTSST0N二Boolcan.gctBoolcan("coordinatcdOmission");//EitherruntestingLockortestingsynchronizedprivatestaticfinalbooleanISLOCK=Boolean.getBoolean
此文档下载收益归作者所有