AtomicIntegerArray
和的含义有什么不同AtomicInteger[]
吗?哪一个使用起来更快?(我唯一注意到的是,首先占用的空间要少得多,但这意味着每次重新检查都在检查数组的边界,这样会使其变慢吗?)
编辑:在数组预先初始化的情况下。
AtomicIntegerArray
和的含义有什么不同AtomicInteger[]
吗?哪一个使用起来更快?(我唯一注意到的是,首先占用的空间要少得多,但这意味着每次重新检查都在检查数组的边界,这样会使其变慢吗?)
编辑:在数组预先初始化的情况下。
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
然后,您可以通过将成员变量建模为 avolatile int
并使用来实现类似的内存改进AtomicIntegerFieldUpdater
。
我同意Tom Hawtin 的第一段……</p>
AtomicInteger[]
每个元素都需要一个对象。AtomicIntegerArray
只需要AtomicIntegerArray
对象和数组对象。因此,如果可能,请使用后者。
…但也应该注意这AtomicInteger[]
不是线程安全的。AtomicInteger
具体来说,如果从多个线程访问,数组对单个对象的引用可能正确,也可能不正确。不过,同步对数组对象本身的访问将消除此问题。