1

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

4

2 回答 2

6

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

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

为了安全地共享一个随机访问的元素集合,您需要一个synchronizedList对 plain 的包装器ArrayList,或者一个 lock-free CopyOnWriteArrayList

如果您对数组的固定大小感到满意(看起来确实如此),那么还要考虑一下,AtomicReferenceArray因为它允许原子比较和设置以及获取和设置操作,这可能会让您在实现什么方面更进一步你需要而不需要锁。

于 2012-11-05T20:26:28.013 回答
0

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

    public void get(index i){
        synchronized(..){
           //your code
        }
    }
于 2012-11-05T20:38:01.390 回答