哪个更好".AtomicIntegerArray(1/0为真/假)与AtomicBoolean []?

Joh*_*ine 10 java concurrency multithreading real-time

我对此非常好奇.如果使用值为0和1的AtomicIntegerArray,则可以完成AtomicBoolean数组的相同操作.例:

final AtomicIntegerArray array1 = new AtomicIntegerArray(10);
array1.compareAndSet(3, 0, 1); // 0 = false and 1 = true

// exactly the same thing of:

final AtomicBoolean[] array2 = new AtomicBoolean[10];
for(int i = 0; i < array2.length; i++)
     array2[i] = new AtomicBoolean(false);
array2[3].compareAndSet(false, true);
Run Code Online (Sandbox Code Playgroud)

您认为哪一个更快更好?

Gra*_*ray 12

您认为哪一个更快更好?

有趣的问题.如果你做了很多次循环,那么这个速度可能只是可见的.否则担心它会过早优化.我会选择最干净,最容易维护的模式.

在封面下,两种方法都使用,Unsafe.compareAndSwapInt(...)因此性能可能非常相似.由于访问volatile存储没有阻塞,因此这不是冲突.该AtomicBoolean阵列肯定会有更多与之关联的对象 - 每个对象都有自己的易失性存储.此外,在封面下,AtomicBoolean存储boolean价值,int因此没有储蓄.

我的直觉告诉我要使用AtomicIntegerArray.您编写的代码较少,这通常意味着更多依赖JDK来做正确的事情.要想出来,你必须在生产架构上测试一些大量的迭代才能确定.我怀疑差异可以忽略不计,难以衡量.

不是一个很好的答案,但希望在这里有所帮助.

编辑:

所以我只是进行了一些测试,我看不出任何明显的差异.这是我的小测试程序.它使用了100个线程并运行了1000万次迭代,它们彼此相差0-10%.正如@mttdbrd指出的那样,这绝不是一个"现实生活"测试.只有在您真正知道是否存在差异之前,才能在生产中使用代码实际运行.

编辑:

在调整我的程序以确保我根据@ mttdbrd的文档预热热点编译器并更改程序以便能够更好地调整条目数之后,我看到了一些有趣的结果.

数组中有1000个元素:

AtomicIntegerArray in 4224 millis
AtomicBoolean[]    in 3546 millis    (always a little bit faster)
Run Code Online (Sandbox Code Playgroud)

但是数组中有10个元素:

AtomicIntegerArray in 26506 millis
AtomicBoolean[]    in 13263 millis  (much faster)
Run Code Online (Sandbox Code Playgroud)

另请注意速度差异.这是有道理的,因为有更多的线程争用.100个线程更可能需要旋转10个元素而不是1000个元素.

这是什么意思?如果你从一个改变到另一个,你可以节省自己每次操作最多1 纳秒.威力.因此,您应该选择最干净,最容易维护的模式,而不是担心两者的性能.

  • @Gray我喜欢你编写程序的热情但不幸的是,微基准测试基本没用:https://www.ibm.com/developerworks/java/library/j-jtp02225/如上所述,这需要在完整的生产环境. (2认同)