gpt4 book ai didi

java - 确保流的工作线程完成后的内存一致性

转载 作者:行者123 更新时间:2023-11-30 05:17:41 26 4
gpt4 key购买 nike

如何确保工作线程完成处理以下代码中的流后,即在 (*) 处,strValues的内容数组是一致的,即主线程位于 (*)没有看到陈旧的null strValues 中任何一个的值数组条目?

    int N = 50;
String[] strValues = new String[N];
IntStream.range(0, N)
.parallel()
.forEach(i -> strValues[i] = Integer.toString(i));
// (*) Is strValues consistent here?
for (String strValue : strValues) {
System.out.println(strValue);
}

(当然,我可以使用 Integer.toString(i) 而不是 .map(...) 返回 .forEach(...) ,但这不是我要在这里说明的内容,并且出于效率原因或因为您,它并不总是可用的选项必须让工作人员设置或返回许多不同的值。)

实际上,我从未见过 strValues 的等价物。数组条目为 null当从一个线程设置数组条目然后从另一个线程读取时。然而,我知道Java的内存模型并不能保证这一点,因此AtomicInteger的存在等等

但是没有AtomicArray Java 中的等价物。你能做的最好的事情就是初始化一个 AtomicReference[]空数组 AtomicReference对象,并从工作线程设置它们。但这对于CPU资源和内存来说是非常低效的。

也没有办法可靠地刷新 CPU 的所有缓存,无论是从 Java 还是潜在的 at all .

我知道栅栏的存在是为了防止内存操作重新排序,但我不认为它们会改变内存刷新语义。或者,内存操作重新排序是导致 Java 内存模型需要 Atomic* 的唯一问题吗?类(class)?

我的主要问题:如何从一个线程(或一组工作线程)设置数组中的值,然后尝试从另一个线程读取它们,而不会遇到过时的值?我特别想知道当工作线程到达流末尾时是否放置了适当的内存栅栏或类似的东西。 (我不明白这是如何自动完成的,所以我猜它不会发生。)

最佳答案

But there is no AtomicArray equivalent in Java.

是的,有: AtomicReferenceArray<E> .

int N = 50;
AtomicReferenceArray<String> strValues = new AtomicReferenceArray<>(N);
IntStream.range(0, N)
.parallel()
.forEach(i -> strValues.set(i, Integer.toString(i)));
for (int i = 0; i < strValues.length(); i++) {
System.out.println(strValues.get(i));
}

此答案源自Java volatile array?

关于java - 确保流的工作线程完成后的内存一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60123374/

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