多线程以原子方式汇总大量值

时间:2014-12-23 21:51:00

标签: java multithreading

我正在开发一个应用程序,其中我们有大量的线程,并且必须以原子方式添加100的值。我使用的AtomicLong效果很好,但仍需要提高性能。有没有比AtomicLong提供更好性能的东西?

2 个答案:

答案 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