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