AtomicIntegerArray和AtomicInteger[]的含义有什么不同吗?哪一个使用起来更快?(我注意到的唯一一件事是first占用的空间要少得多,但这意味着每次重新检查都会检查数组的边界,所以这会使速度变慢吗?)
编辑:在数组被预初始化的场景中。
发布于 2009-03-28 12:19:42
AtomicInteger[]将要求每个元素有一个对象。AtomicIntegerArray只需要AtomicIntegerArray对象和数组对象。因此,如果可能,请使用后者。
即使对于普通数组,边界检查的开销也非常小。重要的是,从多个处理器访问同一缓存行中的数据可能会导致严重的性能问题。因此,单独的对象或有意避免关闭数组元素可能会有所帮助。
发布于 2009-03-28 14:23:11
发布于 2009-03-28 16:39:30
在底层,AtomicInteger和AtomicIntegerArray通常使用相同的低级API来执行读取、写入和其他归档存储操作。(例如,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来实现类似的内存改进。
https://stackoverflow.com/questions/692677
复制相似问题