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是线程安全的整数数组
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*扩展。