我有一个与通过原子引用访问各个元素有关的问题。如果我有一个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; } }} 最佳答案 在这种情况下是否应该进行数据争夺导致输出为21/22?确实有。您的线程寿命很短,以至于它们很可能不在同一时间运行。  在这种情况下,数据争夺不是为了拥有AtomicIntegerArray数据结构(为每个元素提供单独的AtomicReference)的动机吗?是的。  任何人都可以让我知道我要去哪里了。启动线程需要1到10毫秒。即使不对代码进行JIT运算,增加这样的值也可能需要由于启动线程所需的时间比操作时间长20到200倍,因此它们不会同时运行,因此不会出现竞争状况。尝试将值增加几百万倍,因为两个线程同时运行,所以您处于竞争状态。
08-17 10:57