Java AtomicIntegerArray vs AtomicInteger[]

Java AtomicIntegerArray vs AtomicInteger[],java,concurrency,atomic-values,Java,Concurrency,Atomic Values,AtomicIntegerArray和AtomicInteger[]的含义有什么不同吗? 哪一个使用起来更快? (我注意到的唯一一点是,第一次检查占用的空间要小得多,但这意味着每次重新检查都是在检查数组的边界,所以这会使速度变慢?) 编辑:在数组预初始化的场景中。AtomicInteger[]将要求每个元素有一个对象AtomicIntegerArray只需要AtomicIntegerArray对象和数组对象。因此,如果可能,请使用后者 即使对于普通数组,边界检查的成本也非常小。重要的是,从多个处

AtomicIntegerArray
AtomicInteger[]
的含义有什么不同吗? 哪一个使用起来更快? (我注意到的唯一一点是,第一次检查占用的空间要小得多,但这意味着每次重新检查都是在检查数组的边界,所以这会使速度变慢?)


编辑:在数组预初始化的场景中。

AtomicInteger[]
将要求每个元素有一个对象
AtomicIntegerArray
只需要
AtomicIntegerArray
对象和数组对象。因此,如果可能,请使用后者


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

我同意汤姆·哈温的第一段

AtomicInteger[]将要求每个元素有一个对象。AtomicIntegerArray只需要AtomicIntegerArray对象和数组对象。因此,如果可能,请使用后者

…但还应注意,AtomicInteger[]不是线程安全的。具体来说,如果从多个线程访问,数组对单个AtomicInteger对象的引用可能正确,也可能不正确。不过,同步对阵列对象本身的访问将消除此问题。

  • AtomicInteger[]是线程安全整数的数组
  • 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 = ...;
类读取计数器{
私有最终字符串\u文件名;
私有最终原子整数_readCount;
...
}
私有最终映射_counterByName=。。。;

然后,您可以通过将成员变量
\u readCount
建模为
volatile int
并使用。

谁关心边界检查?如果您查看(明显的)源代码,例如getAndSet,它会同时为get和compareAndSet进行地址计算(尽管比这更糟糕,大多数处理器可以在没有cas的情况下进行get和set)。tnx(没有看到您的第二段),所以最好不要同时创建所有对象?(或者使用一些随机顺序?)(我做了一个快速编辑。)在不同的时间创建对象不会有帮助,因为GC会重新排列它们。java.util.concurrent中的一个类甚至添加了大量填充(在最新版本中)。将填充元素添加到AtomicIntegerArray应该更容易、更清晰,只需向左移动。Atomic*的要点是避免同步。假设使用AtomicInteger[]的方法是创建所有AtomicInteger一次,然后安全地发布数组。我同意。我并不提倡使用AtomicInteger[],只是指出了其中的区别,这就是问题所在:)以更新程序操作的较低速度为代价(尽管get和set都很快)。有时候,作为一种节省内存的黑客,它值得从Atomic*扩展。