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并发工具类LongAdder原理实例解析 Java并发工具类LongAdder是Java 8中引入的一种高性能的并发工具类,用于解决高并发情况下的计数器更新问题。LongAdder的出现是为了解决AtomicLong在高并发情况下的性能问题。...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
3. Lock接口与ReentrantLock类:提供了比synchronized更灵活的锁机制,支持公平锁、非公平锁、读写锁等。 4. volatile与synchronized的区别:volatile只能保证可见性,而synchronized能保证可见性和原子性。 四、...
在Java开发中,高效地生成唯一且自增的ID是许多系统设计的关键部分。"Java快速ID自增器"就是为了解决这个问题而设计的一种工具或解决方案。它旨在提供一个高性能、线程安全的方式来生成自增ID,尤其适用于那些需要...
- **Lock接口与ReentrantLock** 提供了比`synchronized`更细粒度的锁控制,可以实现公平锁和非公平锁,以及可中断和可重入的特性。 4. **并发设计模式** - **生产者-消费者模式** 使用队列作为缓冲区,一个线程...
《Java语言规范,Java SE 8版》是Java开发者的重要参考文档,它详细...对于开发者来说,深入理解和掌握Java 8的新特性,将有助于编写出更高效、更优雅的代码。阅读《Java语言规范,Java SE 8版》是掌握这些知识的关键。
5. **ReentrantLock**: 这是可重入的互斥锁,比`synchronized`关键字更灵活,支持公平锁和非公平锁,以及可中断和定时等待。 6. **Atomic* 类**: 如AtomicInteger、AtomicLong等,提供了原子操作,保证在并发环境下...
Java并发工具类如`ExecutorService`, `Future`, `Callable`, `BlockingQueue`等,提供了比基本的`Thread`和`synchronized`更高级的并发控制。例如,`ExecutorService`可以帮助我们管理和控制线程池,有效地管理线程...
通过学习《Java 并发编程实战》,开发者可以更好地理解和掌握Java并发编程的核心技术,从而编写出更健壮、高效的并发程序。这本书的PDF版本包含了清晰的目录结构,方便读者查阅和学习。使用福昕阅读器打开,能确保...
"java利用oss实现下载功能" Java是当前最流行的编程语言之一,而 OSS(Object Storage Service)是阿里云提供的一种对象存储服务,通过使用Java和OSS可以实现下载功能。本文将详细介绍如何使用Java和OSS实现下载...
这本书旨在帮助读者理解并掌握在高并发环境下编写高效、稳定且可扩展的Java应用程序的关键技巧和最佳实践。以下是该书可能涵盖的一些核心知识点: 1. **并发基础**:首先,书中会介绍并发编程的基本概念,如线程、...
此外,`java.util.concurrent.locks`包中的锁接口和类,如`ReentrantLock`和`ReadWriteLock`,提供了比Java内置锁更细粒度的控制,有助于提高并发程序的性能。 对于线程池的使用,本书也进行了详细的探讨。线程池...
3. **Locks**: 自Java 5起,引入了更灵活的锁机制,如`ReentrantLock`,提供了比`synchronized`更高级别的锁控制。 4. **Atomic Types**: `java.util.concurrent.atomic`包提供了一组原子类,用于执行无锁原子操作,...
Java并发编程是Java平台中的重要特性,它提供了一套强大且高效的工具,使得开发者能够创建多线程程序,实现高效并行处理。本资源“java concurrent 精简源码”着重关注Java并发库(java.util.concurrent)的核心概念...
《Java并发编程实战》是Java开发者深入理解和掌握并发编程的一本经典著作...通过阅读《Java并发编程实战》,读者可以深入学习这些知识点,从而更好地应对多线程环境下的编程挑战,编写出更加健壮和高效的Java应用程序。
再者,`java.util.concurrent.atomic`包中的原子类提供了非阻塞的线程安全操作,如`AtomicInteger`、`AtomicLong`等,它们使用CAS(Compare and Swap)操作实现无锁编程,提高了并发性能。 最后,死锁、活锁和饥饿...