教育培训手机网站模板下载,网站好玩代码和特效,网站备案没通过,做亚马逊跨境电商要多少投资atomiclong我经常听到Java原子类型#xff08;java.util.concurrent.atomic#xff09;超级快#xff0c;可以很好地与高度并发的代码一起使用。 大多数时候#xff0c;原子以健壮和高效的方式完成其工作。 但是#xff0c;在某些情况下#xff0c;原子类型上非托管争用的… atomiclong 我经常听到Java原子类型java.util.concurrent.atomic超级快可以很好地与高度并发的代码一起使用。 大多数时候原子以健壮和高效的方式完成其工作。 但是在某些情况下原子类型上非托管争用的隐藏成本成为严重的性能问题。 让我们看一下如何实现java.util.concurrent.atomic.Atomic *类型以及该设计的含义。 所有原子类型例如AtomicLongAtomicBooleanAtomicReference等本质上都是易失值的包装器。 附加值来自内部使用的sun.misc.Unsafe 可为这些类型提供CAS功能。 本质上 CAS比较和交换是由现代CPU硬件实现的原子指令它允许以安全有效的方式进行无阻塞的多线程数据操作。 与锁定相比CAS的巨大优势在于由于没有套利CAS不会在内核级别上产生任何开销。 而是编译器发出CPU指令例如锁cmpxchg锁xadd锁addq等。这与从JVM角度调用指令所获得的速度一样快。 在许多情况下低成本的CAS提供了一种有效的替代方法来锁定基元但是在满足场景的情况下使用CAS的成本呈指数级增长。 Dave DiceDanny 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.0x86_64和Intel®CoreTM i7-3632QM CPU 2.20GHz8个逻辑内核上使用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.htmlatomiclong