gpt4 book ai didi

java - AtomicReference 的各个元素上的数据争用

转载 作者:太空宇宙 更新时间:2023-11-04 12:06:17 28 4
gpt4 key购买 nike

我有一个有关通过原子引用访问各个元素的问题。如果我有一个 IntegerArray 和对其的原子引用;通过 AtomicReference 变量读取和写入数组的各个元素是否会导致数据争用?

在下面的代码中:num 是一个整数数组,aRnumbers 是对该数组的原子引用。在线程 1 和 2 中;我访问 aRnumbers.get()[1] 并将其增加 1。

我能够通过原子引用访问各个元素,而无需每次都通过数据竞争来获得准确的结果,两个线程完成后,主线程中 aRnumbers.get()[1] 的输出为 22。

但是,由于原子引用是在数组上定义的,而不是在单个元素上定义的;在这种情况下,不应该存在数据竞争导致输出为 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;

}

}

}

最佳答案

shouldn't there be a data race in this case leading to 21/22 as the output?

确实有。您的线程生命周期很短,很可能它们不会同时运行。

Isn't having data races in this case the motivation for having a AtomicIntegerArray data structure which provides a separate AtomicReference to each element?

是的,确实如此。

Could anyone kindly let me know where I am going wrong.

启动线程需要 1 - 10 毫秒。

即使没有对代码进行 JIT 处理,增加这样的值也可能需要 << 50 微秒。如果经过优化,每次增量大约需要 50 - 200 纳秒。

由于启动线程所需的时间比操作时间长约 20 - 200 倍,因此它们不会同时运行,因此不存在竞争条件。

尝试将值增加几百万次,这样就会出现竞争条件,因为两个线程同时运行。

关于java - AtomicReference 的各个元素上的数据争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333054/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com