AtomicIntegerArray
和AtomicInteger[]
的含义是否有任何区别?
哪一个更快使用?
(我注意到的只是第一个占用更少的空间,但这意味着每次重新检查都会检查数组的边界,这会使它变慢?)
编辑:在数组已预先初始化的情况下。
答案 0 :(得分:9)
AtomicInteger[]
每个元素都需要一个对象。 AtomicIntegerArray
只需要AtomicIntegerArray
对象和数组对象。所以尽可能使用后者。
即使对于普通数组,边界检查的成本也非常小。可能重要的是,从多个处理器访问同一缓存行中的数据可能会导致严重的性能问题。因此,单独的对象或故意避免数组的紧密元素可以提供帮助。
答案 1 :(得分:5)
答案 2 :(得分:2)
在下面,AtomicInteger和AtomicIntegerArray通常使用相同的低级API来执行读取,写入和其他CAS操作。 (例如,OpenSDK 7使用sun.misc.Unsafe
在两个类中执行CAS操作。)因此使用AtomicInteger []几乎没有性能优势。正如您已经注意到的那样,使用AtomicIntegerArray 具有显着的内存优势。
实际上,使用后者可以使您不必构建所有AtomicInteger实例。请记住,由于并发原因,你不能天真地分配那些;您必须预先分配或使用一些安全的发布机制。因此,除了内存优势之外,您的代码也更清晰。
类似地,如果你有一堆具有AtomicInteger成员的对象,例如:
class ReadCounter {
private final String _fileName;
private final AtomicInteger _readCount;
...
}
private final Map<String, ReadCounter> _counterByName = ...;
然后,您可以通过将成员变量_readCount
建模为volatile int
并使用AtomicIntegerFieldUpdater
来实现类似的内存改进。
答案 3 :(得分:0)
我同意Tom Hawin的第一段......
AtomicInteger []每个元素都需要一个对象。 AtomicIntegerArray只需要AtomicIntegerArray对象和数组对象。所以尽可能使用后者。
...但是还应该注意AtomicInteger []不是线程安全的。具体来说,如果从多个线程访问,则数组对各个AtomicInteger对象的引用可能也可能不正确。但是,同步对数组对象本身的访问将消除此问题。