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

标签 java concurrency visibility

在 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/

相关文章:

javascript - 切换对象的可见性或显示

java - 在 ms word(97-2003) 中导出报告,而不在 jasper 报告中使用 RTFExporter

Java printf 给出 "change type to Object"错误

java - 阻止 schemagen 将父类(super class)添加到模式中?

java - 为什么即使没有错误(HELP),我的应用也会崩溃

java - Java中并发管道的策略

multithreading - Erlang在运行并发任务时没有使用所有CPU核心,为什么?

java - java中两个线程同时访问一个变量

java - 使库的方法对外部访问不可见但对库可见

jQuery: "Nested"可见性