读/写数组中的元素是原子操作吗?

woo*_*ngs 1 java synchronization thread-safety

我有多个线程从一个标记为 final 的共享数组访问元素(我永远不会尝试为它分配另一个数组)。我需要同步任何东西吗?我可以假设对元素的读/写是原子的吗?

Mar*_*nik 6

除非数组是 long 或 double 类型,否则写入是原子的。但是, atomic 属性对您没有帮助,因为不能保证写入对其他线程可见

如果数组是引用类型,问题会更严重,因为其他线程可能会看到您的对象被撕裂:有些字段可见,有些字段不可见。

要安全地共享元素的随机访问集合,您需要synchronizedList在普通ArrayList或无锁周围包装CopyOnWriteArrayList

如果您对数组的固定大小没问题(看起来是这样),那么还要考虑一下,AtomicReferenceArray因为它允许原子比较和设置和获取和设置操作,这可能会让您更进一步地实现什么你需要而不需要锁。