我有多个线程从一个标记为final的共享数组访问元素(我永远不会尝试为其分配另一个数组)。我需要同步吗?我可以假设对元素的读/写是原子的吗?
答案 0 :(得分:4)
除非数组的类型为long或double,否则写入是原子的。但是,原子属性对您没有帮助,因为不能保证写入可见到其他线程。
如果数组是引用类型,则问题更严重,因为其他线程可能会看到您的对象被撕裂:某些字段可见,有些则不可见。
要安全地共享随机访问的元素集合,您需要synchronizedList
包围普通ArrayList
或无锁CopyOnWriteArrayList
的包装。
如果你对数组的固定大小没问题(看起来如此),那么也要研究AtomicReferenceArray
因为它允许原子比较和设置以及获取和设置操作,这可能是带你进一步实现你需要的东西,而不需要锁。
答案 1 :(得分:0)
由于您有多个线程可以读取和写入向量的元素,因此当线程读取时,另一个线程会写入相同的单元格。放一个同步块。 伪代码示例:
public void get(index i){
synchronized(..){
//your code
}
}