0

以下是我的 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 的不同组件。

4

2 回答 2

3

上面的代码是线程安全的吗?

这取决于您对线程安全的含义。每个单独的 get() 和 set() 操作都应该是线程安全的,但是多个线程可以同时调用此方法,因此可以在第一个线程完成迭代之前由第二个线程重新分配单个数组条目。除了在一个公共对象(可能是数组或其他一些专用的锁定对象)上同步之外,您无能为力

我不想在读取元素时保持锁定,而是在设置每个组件的值期间锁定。这意味着许多线程可以设置array1的不同组件。

如果我理解这一点,您可以按原样使用您的代码而无需额外锁定(见上文),除了这部分:

 array1.set(b);

需要阅读:

 array1.set(i, b);
于 2012-08-05T12:59:26.930 回答
1

在对 array1.get(i) 的两次连续调用中,您可能会得到不同的值。如果您想避免同步,请查看写入数据结构的副本(例如 CopyOnWriteArrayList - http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

于 2012-08-05T14:41:11.043 回答