AtomicLong 是通过cas来实现的,已经很高效了,还有不有优化的空间呢。
我们知道AtomicLong在高并发的时候,可能要尝试多次才能成功。
AtomicLong的作者是Doug lea ,他的想法是把竞争分散:
具体的做法是把一个数拆成多个数的和,修改的时候只改其中一个数,这样冲突的概率减少很多。
具体做法:
transient volatile long base;
transient volatile Cell[] cells;
修改
public void add(long x) {
Cell[] as; long b, v; int m; Cell a;
if ((as = cells) != null || !casBase(b = base, b + x)) {
boolean uncontended = true;
if (as == null || (m = as.length - 1) < 0 ||
(a = as[getProbe() & m]) == null ||
!(uncontended = a.cas(v = a.value, v + x)))
longAccumulate(x, null, uncontended);
}
}
修改的时候,首先参数修改base,如果不成功,会去修改数组中的一个数
得到结果
public long sum() {
Cell[] as = cells; Cell a;
long sum = base;
if (as != null) {
for (int i = 0; i < as.length; ++i) {
if ((a = as[i]) != null)
sum += a.value;
}
}
return sum;
}
结果是 base和一个数组所有数的和。
一些人说,base和数组中的数都是一直在改的,会不准,不过这个没关系。高并发的时候也不可能准,反正看到的都是瞬时的值。
分享到:
相关推荐
Java concurrency之AtomicLong原子类_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
java_util_concurrent_user_guide_cn.pdf 内容预览: 1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ...24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
Java concurrency之AtomicLongArray原子类_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
java_util_concurrent_user_guide_cn.pdf 内容预览: 1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ... 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReferenc
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_...24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
jmh-样本 一些 JMH - Java Microbenchmark Harness Samples 包含一些 JMH 示例代码。 地图推杆 比较 ConcurrentHashMap 与同步映射 ...比较 AtomicLong 与 LongAdder 随机基准 比较 Random 与 ThreadLocalRandom
2.2.2 原子类(AtomicInteger,AtomicLong,AtomicReference) 13 2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3...
基于Redis服务器构建的分布式和可扩展的Java数据结构(Set, SortedSet, Map, ConcurrentMap, List, Queue, Deque, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog),是一个高级Redis Java客户端...
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_...24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
原子操作是不可再分割的基本操作,JUC 提供了一系列原子操作类,如 AtomicInteger、AtomicLong 等。 4. 同步器(Synchronizers):JUC 中的同步器主要通过 AQS(AbstractQueuedSynchronizer)提供支持。
Redisson-Redis Java客户端具有内存中数据网格的功能 | | | | | 基于高性能的异步和无锁Java Redis客户端和框架。...对象持有人,二进制流持有人,地理空间持有人,BitSet,AtomicLong,AtomicDouble,Publish
AtomicLong在高并发下性能甚至还不如加锁,LongAdder比AtomicLong更适用于高并发下的累加TODO后续研究其原理 强引用,软引用,弱引用,幽灵引用,引用数量 强引用:StrongReference 例如Date date = new Date();...
of java.util.Deque 分布式 java.util.Map 分布式 java.util.concurrent.ConcurrentMap 通过TTL实现可重入 java.util.concurrent.locks.Lock 分布式 java.util.concurrent.atomic.AtomicLong分布式 ...
主要介绍了Java中对AtomicInteger和int值在多线程下递增操作的测试,本文得出AtomicInteger操作 与 int操作的效率大致相差在50-80倍上下的结论,需要的朋友可以参考下
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, ...原子性长整型 AtomicLong,原子性引用型 AtomicReference 修改数据: 一 服务端修改数据: 一 文章知识点与官方知识档案匹配,可进一步学习相关知识
What is AtomicIntegerFieldUpdater 相信前言部分讲的已经很清晰易懂了,AtomicIntegerFieldUpdater就是用来更新某一个实例对象里面的int属性的。 但是注意,在用法上有规则: 字段必须是volatile类型的,在线程...
AtomicLong、LongAdder AtomicReference、AtomicReferenceFieldUpdater AtomicStampReference:CAS的ABA问题 原子性-synchronized 修饰代码块:大括号括起来的代码,作用于调用的对象 修饰方法:整个方法,作用于调用...
迅雷笔试题java Java并发编程:03-多线程并发下载器, 支持断点下载(手写不限速的迷你版迅雷) ...AtomicLong 07 计时器的使用CountDownLatch 08 并发量的控制(信号量): Semaphore 09 阻塞队列的使用: Lin