gpt4 book ai didi

java - 同时写入数组时的可见性问题

转载 作者:行者123 更新时间:2023-12-01 09:53:22 27 4
gpt4 key购买 nike

在 Java 中,如果多个线程分别异步写入原始( double )数组的单独部分,并且(仅)主线程在所有线程完成写入后从数组中读取。

  1. 是否存在可见性问题,即是否有机会读取或写入原始数组的线程本地版本?
  2. 如果1.为真,是否可以通过在主线程读取之前添加内存屏障来解决这个问题?您建议使用哪一种?

下面的示例代码。

提前非常感谢,曼努埃尔

    //Example code to calculate distance of 1 point to 1mln other points:
double[][] history = this.createRandomMatrix(1000000,8);
double[] order = this.createRandomMatrix(1,8)[0];
double[] result = new double[1000000];
for(int i = 0; i< 100;i++){
pool.execute(new Calculator(history, newPoint, result,i*10000,10000 + i * 10000));
}
pool.shutdown();
try {
pool.awaitTermination(1, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//read happens here

//Calculator run function
public void run() {
for(int i = start;i<end;i++){
result[i] = this.computeDistance(history[i],order);
}
}

最佳答案

由于您正在谈论的是一个数组(静态数组),因此不会创建线程本地版本,除非 intentionally created 。每个 block 都会读/写同一内存块(数组的内存块)中的地址。由于写入是对数组的不同部分完成的,因此没有 data races会发生。由于您说读取是在其他线程完成写入后由主线程完成的,因此不需要同步。

关于java - 同时写入数组时的可见性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443765/

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