Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即;“更好”;。原子整数数组(1/0为真/假)与原子布尔[]?_Java_Multithreading_Concurrency_Real Time - Fatal编程技术网

Java 即;“更好”;。原子整数数组(1/0为真/假)与原子布尔[]?

Java 即;“更好”;。原子整数数组(1/0为真/假)与原子布尔[]?,java,multithreading,concurrency,real-time,Java,Multithreading,Concurrency,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 = n

我对此很好奇。如果使用值为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);
final-AtomicIntegerArray数组1=新的AtomicIntegerArray(10);
数组1.比较数据集(3,0,1);//0=假,1=真
//与以下内容完全相同:
final AtomicBoolean[]array2=新的AtomicBoolean[10];
for(int i=0;i

您认为哪一个更快更好?

正在实际观察AtomicIntegerArray的实现

看起来它比我想象的更受关注

它不使用对象来存储值,这使得它在内存中的效率更高。 事实上,它使用一个简单的int[],然后以安全的方式访问它们

因此,我认为如果需要使用多个AtomicInteger,最好使用AtomicIntegerArray

原子集成阵列: 使用不安全类对AtomicIntegerArray中的单个int[]进行原子访问

原子布尔[]: 数组中的每个对象都有自己的对象(自身),用于进行原子访问

因此,我希望在使用AtomicBoolean[]的重并发线程环境中,性能会更好,内存消耗比AtomicIntegerArray更多

你认为哪一个更快更好

有趣的问题。只有当你进行大量的循环时,这种速度才可能是可见的。否则担心它就有点过早优化的味道。我会选择最干净、最容易维护的图案

在封面下,这两种方法都使用了不安全的。由于对
volatile
存储的访问没有阻塞,因此这与冲突无关。
AtomicBoolean
数组肯定会有更多的对象与之关联–每个对象都有自己的易失性存储。另外,在封面下,
AtomicBoolean
boolean
值存储为
int
,因此没有任何节省

我的直觉告诉我使用原子整数数组。编写的代码更少,这通常意味着更多地依赖JDK来做正确的事情。为了弄清楚这一点,您必须在生产架构上测试大量迭代才能确定。我怀疑这种差异将是微不足道的,难以衡量

这不是一个很好的答案,但希望这里有一些有用的东西

编辑:

所以我只是做了一些测试,没有发现任何显著的差异。这是我的。它使用了100个线程,运行了1000万次迭代,它们之间的距离在0-10%之间。正如@mttdbd所指出的,这绝不是一个“现实生活”测试。在您真正知道是否存在差异之前,只需在生产中使用实际运行的代码将其固定

编辑:

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

阵列中有1000个元素:

AtomicIntegerArray in 4224 millis
AtomicBoolean[]    in 3546 millis    (always a little bit faster)
但是,如果阵列中有10个元素:

AtomicIntegerArray in 26506 millis
AtomicBoolean[]    in 13263 millis  (much faster)
请注意一般情况下的速度差。这是有意义的,因为有更多的线程争用。100个线程更有可能需要使用10个元素而不是1000个元素来旋转


这是什么意思?如果您从一个切换到另一个,则每次操作最多可节省1纳秒。可以因此,与其担心两者的性能,不如选择最干净、最容易维护的模式。

我想说的是,两者性能相同,除非竞争激烈。正如格雷的基准测试所显示的那样,
AtomicBoolean[]
可以轻松地战胜
AtomicIntegerArray
。缺少的是解释:

AtomicIntegerArray
在其内部
int[]
上操作时,将所有
int
放置在彼此相邻的位置,而
AtomicBoolean[]
是包含对象的
int
数组。这些对象会增加少量(8或12)字节的开销,因此底层的
int
s不会被紧密压缩

因此,它们跨越不同数量的缓存线,在这里发挥作用。由于缓存线通常为64字节,新AtomicIntegerArray(10)
的整个数据都适合它(除非它开始时未对齐,然后使用两条缓存线)。这意味着100%的错误共享概率,也就是说,所有线程都满足于一个变量

通过使用原子布尔[]的开销,我们可以得到大约160个字节,而不是40个字节,从而大大减少了错误共享


我猜Gray的基准测试有相当大的开销(
%
操作和条件),实际速度差异会更大



这并不意味着
AtomicIntegerArray
是坏的。只是,如果真的有激烈的竞争,就不应该这样使用它。简单的解决方案是分配一个更大的数组,只使用每16个元素,有效地将错误共享减少到零。

对于“更快”位,意见是无用的,基准是强制性的。int和boolean一开始就不一样,因此没有“更好的”;如果需要布尔值,请使用布尔值…AtomicIntegerArray有一个内部int[]数组。如果创建一个原子布尔数组,可能会消耗更多内存,但在内部,它的“布尔”值由一个基元int支持,因此每个值都消耗相同的内存。你真的需要测试一下。我猜如果你说的是原子交易