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

时间:2012-11-05 20:25:06

标签: java synchronization thread-safety

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

2 个答案:

答案 0 :(得分:4)

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

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

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

如果你对数组的固定大小没问题(看起来如此),那么也要研究AtomicReferenceArray因为它允许原子比较和设置以及获取和设置操作,这可能是带你进一步实现你需要的东西,而不需要锁。

答案 1 :(得分:0)

由于您有多个线程可以读取和写入向量的元素,因此当线程读取时,另一个线程会写入相同的单元格。放一个同步块。 伪代码示例:

    public void get(index i){
        synchronized(..){
           //your code
        }
    }