我经常听到Java原子类型(java.util.concurrent.atomic)超级快,可以很好地与高度并发的代码一起使用。 在大多数情况下,原子以健壮和高效的方式发挥作用。 但是,在某些情况下,原子类型上非托管争用的隐藏成本成为严重的性能问题。 让我们看一下如何实现java.util.concurrent.atomic.Atomic *类型以及该设计的含义。

所有原子类型,例如AtomicLong,AtomicBoolean,AtomicReference等,本质上都是易失值的包装器。 附加值来自内部使用的sun.misc.Unsafe ,可为这些类型提供CAS功能。

本质上, CAS(比较和交换)是由现代CPU硬件实现的原子指令,它允许以安全有效的方式进行无阻塞的多线程数据操作。 与锁定相比,CAS的巨大优势在于,由于没有套利,CAS不会在内核级别上产生任何开销。 而是,编译器发出CPU指令,例如锁cmpxchg,锁xadd,锁addq等。这与从JVM角度调用指令所获得的速度一样快。

在许多情况下,低成本的CAS提供了一种有效的方法来锁定基元,但是在满足场景的情况下使用CAS的成本呈指数级增长。

Dave Dice,Danny Hendler和Ilya Mirsky在一项非常有趣的研究中对这个问题进行了研究 。 我强烈建议您阅读全文,因为它比这篇简短的文章包含了更多有价值的信息。

我从论文中复制了一些概念,并对其进行了测试。 由于人们对原子(CAS)性能存在普遍的误解,因此许多Java程序员应该发现结果很能说明问题。

实现退避竞争管理的代码非常简单。 它回退了很短的时间,而不是遍历失败的比较和交换,让其他线程尝试更新。

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.LockSupport;public class BackOffAtomicLong {public static long bk;private final AtomicLong value = new AtomicLong(0L);public long get() {return value.get();}public long incrementAndGet() {for (;;) {long current = get();long next = current + 1;if (compareAndSet(current, next))return next;}}public boolean compareAndSet(final long current, final long next) {if (value.compareAndSet(current, next)) {return true;} else {LockSupport.parkNanos(1L);return false;}}public void set(final long l) {value.set(l);}}

该测试是在64位Linux 3.5.0(x86_64)和Intel®CoreTM i7-3632QM CPU @ 2.20GHz(8个逻辑内核)上使用64位Hotspot Java 1.7.0_25-b15执行的。

不出所料,对于高负载争用,两种实现之间没有太大的区别:

但是,在商店竞争激烈的情况下,它变得更加有趣。 这种情况暴露了Hotspot的AtomicLong实现所采用的乐观重试方法的弱点。

同样,在读写器混合竞争的情况下,轻量级访问管理的好处也显而易见。

当涉及套接字间通信时,结果会有很大的不同,但是不幸的是,我在某种程度上失去了针对基于Intel Xeon的硬件进行测试的输出。 随时发布不同架构/ JVM的结果。

参考:是否 希望使用AtomicLong更快? 等待它。 来自我们的JCG合作伙伴 Wojciech Kudla在Fast上。 快点。 怪胎的博客。

翻译自: https://www.javacodegeeks.com/2014/01/want-to-get-faster-with-atomiclong-make-it-wait.html

想要更快地使用AtomicLong? 等待它。相关推荐

  1. atomiclong_想要更快地使用AtomicLong? 等待它。

    atomiclong 我经常听到Java原子类型(java.util.concurrent.atomic)超级快,可以很好地与高度并发的代码一起使用. 大多数时候,原子以健壮和高效的方式完成其工作. ...

  2. 网络推广方案分享网站想要更快的优化到首页的技巧!

    网络推广方案中网站在上线后,都想让网站的优化排名更高,并得到更多的流量,让网站越来越受欢迎,但要把网站优化到首页并不是件容易的事,它不仅要注意更多的细节,还要做到更适合搜索引擎的优化规则,那么下面网络 ...

  3. [译]写程序更快、更好、更便宜的艺术

    原文 没有人想延迟交付时间.超出预算.没有一个开发人员会在早上醒来的时候想"我今天要做搞一些垃圾代码.我如何才能增加.耗费雇主更多的钱?".尽管如此,还是有许多的软件项目进行的不是 ...

  4. 如何更快地渲染?深入了解3D渲染性能的指南!(2)

    如何更快地渲染-概述: 我将把本文分为两个主要部分: 可以优化的内部渲染因子 可以优化的外部渲染因子 您会发现内部渲染因子与您想要更快地优化/渲染的场景紧密相关,需要更改场景元素和渲染设置. 另一方面 ...

  5. 搜索很久_装了SSD你还需要这个软件才更快,搜索查找文件数据从此不再等待

    在速度性能方面,HDD和SSD相比简直是云泥之别.一个7200转的HDD读写速度才最多可达200MB/S,15000转也才勉强能达到300M/S.而且HDD,速度要快,转速得快,转速越快,越是吵人.而 ...

  6. 数据的黑暗陷阱是什么?——你想要一匹更快的马,还是一辆汽车?

    说明:原文于2016年7月28日发表于云栖社区:https://yq.aliyun.com/articles/58405 [导语]在DT时代,数据无疑是创新的源泉和重要助力.目前,一种"数据 ...

  7. 数据的黑暗陷阱是什么?(二)——你想要一匹更快的马,还是一辆汽车?

    [导语]在DT时代,数据无疑是创新的源泉和重要助力.目前,一种"数据高于一切"的文化,正在慢慢形成.然而,过于依赖数据,让我们得到的,更可能是一个渐进式的解决方案(一匹更快的马), ...

  8. “要想走的更快一个人走,要想走的更远一群人走”志向远大的大学生的HCIE之路...

    2018.3.7 9:30收到邮件的那一刻13个月IE路程正式告一段落.收到PASS邮件既在意料之中又无比兴奋,回想起去年2月份第一次跟班学NA的时刻,往事犹如那一幅幅胶卷在脑海中放映. 2016年下 ...

  9. 听说,你想让自己的Go程序运行的更快?

    原文链接: http://bravenewgeek.com/so-you-wanna-go-fast/ 到现在为止,我已经忘记了我在写什么,但我确定这篇文章是关于Go语言的.这主要是一篇,关于运行速度 ...

最新文章

  1. 讯飞语音:客户端未被授权
  2. Linux网络常用工具分类介绍
  3. iphone电池怎么保养_怎么保持iPhone的电池健康?掌握这4个方面,3年不用换电池...
  4. RedHat 6 安装配置Tomcat 7
  5. Unsatisfied dependency expressed through field 'service'
  6. maven项目修改java编译版本的方式
  7. group_concat 不是可以识别的 内置函数名称。_Python 函数库 APIs 编写指南
  8. linux下达梦数据库启动_linux 平台 达梦DM 7 数据库 启动与关闭
  9. 数学入门题——《算法竞赛入门经典-训练指南》
  10. 面试之 Python 进阶
  11. 安徽关节式焊接机器人_上下料机器人的重要性体现在哪里?它有哪些优势?
  12. java 堆_JAVA学习笔记 07——堆、栈和垃圾回收机制
  13. [Curator] Barrier 的使用与分析
  14. access统计行数 vb_VB代码行数统计工具
  15. 而立之年——三线城市程序员的年终告白
  16. gdown配置代理下载Google drive文件
  17. 时间计算题100道_2019消防工程师考试易考6大类型计算题
  18. requests中get请求没有referer得不到数据
  19. mql4 c语言,MQL4基础:运算符和表达式 -
  20. MOOC战德臣数据库课程自用笔记_8_属性闭包计算方法

热门文章

  1. mysql的on和in用法_数据库中in、on、with的用法及示例。
  2. redis-java客户端jedis测试
  3. redis集群搭建报错-(error) CLUSTERDOWN The cluster is down
  4. 哈儿小波分解和重构(降维和升维)实现算法
  5. jdk12 switch_玩JDK 12的Switch表达式
  6. Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...
  7. java更好的语言_五个使Java变得更好的功能
  8. jaxb报错_JAXB做错了; 尝试Xembly
  9. jboss将war放在那?_将策略插入JBoss Apiman
  10. Spring ClassPathXmlApplicationContext