我正在开发一个应用程序,其中我们有大量的线程,并且必须以原子方式添加100的值。我使用的AtomicLong
效果很好,但仍需要提高性能。有没有比AtomicLong提供更好性能的东西?
答案 0 :(得分:5)
您可以使用LongAdder。 LongAdder提供了比AtomicLong更好的性能。我建议阅读this文章,其中作者发布了基准测试结果并解释了有关LongAdder性能的许多细节。但简而言之LongAdder
扩展Striped64
通过使用单元格的哈希表来处理内容。因此,当2个线程尝试放置一些值时,它们很有可能最终将值放在不同的单元格中。 Cell类使用Padding stratergy来减少CPU缓存内容。此外,如果您查看源代码,那么您会发现该单元类使用CAS。
Unsafe.compareAndSwap操作是原子操作。他们指向一个指针 内存块(在这种情况下由this和valueOffset组成) 一起指向值),比较值和交换值。如果是JVM 发现所寻址的内存的值等于比较 值,然后它将交换值存储在已寻址的内存中 返回true。这意味着CAS操作是一个快速和线程 更新变量值的安全方法,并获得有关是否的反馈 操作成功或是否存在争用。
答案 1 :(得分:1)
JCIP的第15.3.2节:
在高争用级别锁定往往优于原子 变量,但在更现实的争用级别原子变量 跑赢锁。
您可以尝试使用back-off scheme来提高原子变量的性能,也可以切换到使用完全成熟的ReentrantLock
。