AtomicIntegerArray与AtomicInteger []

时间:2009-03-28 12:13:57

标签: java concurrency atomic-values

AtomicIntegerArrayAtomicInteger[]的含义是否有任何区别? 哪一个更快使用? (我注意到的只是第一个占用更少的空间,但这意味着每次重新检查都会检查数组的边界,这会使它变慢?)

编辑:在数组已预先初始化的情况下。

4 个答案:

答案 0 :(得分:9)

AtomicInteger[]每个元素都需要一个对象。 AtomicIntegerArray只需要AtomicIntegerArray对象和数组对象。所以尽可能使用后者。

即使对于普通数组,边界检查的成本也非常小。可能重要的是,从多个处理器访问同一缓存行中的数据可能会导致严重的性能问题。因此,单独的对象或故意避免数组的紧密元素可以提供帮助。

答案 1 :(得分:5)

  • AtomicInteger []是一个线程安全整数数组。
  • AtomicIntegerArray是一个线程安全的整数数组。

答案 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对象的引用可能也可能不正确。但是,同步对数组对象本身的访问将消除此问题。