我有一个关于通过 Atomic Reference 访问单个元素的问题。如果我有一个 IntegerArray 和一个对它的原子引用;通过 AtomicReference 变量读取和写入数组的各个元素会导致数据竞争吗?
在下面的代码中: num 是一个整数数组,其中 aRnumbers 是对数组的原子引用。在线程 1 和 2 中;我访问 aRnumbers.get()[1] 并将其增加 1。
在两个线程完成后,我可以通过原子引用访问单个元素,而无需每次都使用 22 作为主线程中 aRnumbers.get()[1] 的输出来获得准确的结果。
但是,由于原子引用是在数组上而不是在单个元素上定义的;在这种情况下不应该存在导致 21/22 作为输出的数据竞争吗?
在这种情况下,是否存在数据竞争是拥有 AtomicIntegerArray 数据结构的动机,该数据结构为每个元素提供单独的 AtomicReference ?
请在下面找到我正在尝试运行的 java 代码。任何人都可以让我知道我哪里出错了。
import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceExample {
private static int[] num= new int[2];
private static AtomicReference<int[]> aRnumbers;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyRun1());
Thread t2 = new Thread(new MyRun2());
num[0]=10;
num[1]=20;
aRnumbers = new AtomicReference<int[]>(num);
System.out.println("In Main before:"+aRnumbers.get()[0]+aRnumbers.get()[1]);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("In Main after:"+aRnumbers.get()[0]+aRnumbers.get()[1]);
}
static class MyRun1 implements Runnable {
public void run() {
System.out.println("In T1 before:"+aRnumbers.get()[1]);
aRnumbers.get()[1]=aRnumbers.get()[1]+1;
}
}
static class MyRun2 implements Runnable {
public void run() {
System.out.println("In T2 before:"+aRnumbers.get()[1]);
aRnumbers.get()[1]=aRnumbers.get()[1]+1;
}
}
}