【发布时间】:2009-03-28 12:13:57
【问题描述】:
AtomicIntegerArray和AtomicInteger[]的含义有区别吗?
哪一个使用起来更快?
(我唯一注意到的是 first 占用的空间要少得多,但这意味着每次重新检查都会检查数组的边界,这样会使其变慢吗?)
编辑:在数组预初始化的情况下。
【问题讨论】:
标签: java concurrency atomic-values
AtomicIntegerArray和AtomicInteger[]的含义有区别吗?
哪一个使用起来更快?
(我唯一注意到的是 first 占用的空间要少得多,但这意味着每次重新检查都会检查数组的边界,这样会使其变慢吗?)
编辑:在数组预初始化的情况下。
【问题讨论】:
标签: java concurrency atomic-values
AtomicInteger[] 每个元素都需要一个对象。 AtomicIntegerArray 只需要 AtomicIntegerArray 对象和一个数组对象。所以尽可能使用后者。
即使对于普通数组,边界检查的成本也很小。可能重要的是,从多个处理器访问同一高速缓存行中的数据可能会导致严重的性能问题。因此,单独的对象,或故意避免数组中的紧密元素会有所帮助。
【讨论】:
【讨论】:
在下面,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 来实现类似的内存改进。
【讨论】:
我同意Tom Hawtin's first paragraph...
AtomicInteger[]每个元素都需要一个对象。AtomicIntegerArray只需要AtomicIntegerArray对象和一个数组对象。所以尽可能使用后者。
...但也应该注意AtomicInteger[] 不是线程安全的。具体来说,如果从多个线程访问,数组对单个 AtomicInteger 对象的引用可能正确,也可能不正确。不过,同步对数组对象本身的访问将消除此问题。
【讨论】: