以下是我的java代码中的主要操作之一:
AtomicDoubleArray array1 = new AtomicDoubleArray(25);
for(int i = 0; i< array1.size(); i ++){ double a = array1.get(i)* 0.001; 怀疑
以上代码是否是线程安全的?
这取决于你对线程安全的意思。每个单独的get()和set()操作都应该是线程安全的,但是多个线程可以同时调用此方法,因此在第一个线程完成迭代之前,第二个线程可以重新分配各个数组条目。除了在公共对象(可以是数组或其他专用锁对象)上进行同步之外,您无能为力
我想在读取元素时保持锁定但锁定 在设置每个组件的值时。它表示一个数字 线程可以设置array1的不同组件。
如果我理解这一点,您可以按原样使用您的代码而无需额外锁定(参见上文),但此部分除外:
array1.set(b);
需要阅读:
array1.set(i, b);
在对array1.get(i)的两次连续调用中,您可能会得到不同的值。如果要避免同步,请查看写入数据结构上的副本(例如CopyOnWriteArrayList - http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html )