繁体   English   中英

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

[英]Is it atomic operation to read/write elements in a array?

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

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

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

为了安全地共享元素的随机存取集合,您将需要一个synchronizedList围绕一个简单的封装ArrayList ,或无锁CopyOnWriteArrayList

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

因为您有多个线程可以读取和写入向量的元素,所以当一个线程读取时,可能会发生另一个线程写入同一单元的情况。 放置一个同步块。 伪代码示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM