gpt4 book ai didi

java - volatile 变量的更新值对其他线程不可见

转载 作者:行者123 更新时间:2023-11-30 05:44:06 25 4
gpt4 key购买 nike

以下代码片段使用多个线程使用 AtomicInteger 计数到 1 亿。我有 10 个 Writer 线程来模拟写入争用,还有一个单个 Reader 线程来模拟读取争用。作者和读者还共享一个 volatile boolean 变量作为毒丸

但是,只有 Reader 线程能够退出,而 Writers 则不能。尽管将变量声明为 volatile ,但为什么 Reader 线程无法看到更新后的值?

public class AtomicRunnerV2 {

private static final int THREADS = 10;
private static final Integer MAX_COUNT = 100_000_000;

public static void main(String[] args) throws Exception {
AtomicInteger atomicInteger = new AtomicInteger(1);
Boolean data = new Boolean(false);
ExecutorService executorService = Executors.newFixedThreadPool(THREADS + 1);
for (int i = 0; i < THREADS; i++) {
executorService.submit(new Writer(atomicInteger, data));
}
executorService.submit(new Reader(atomicInteger, data));
executorService.shutdown();
}

static class Writer implements Runnable {

private AtomicInteger integer;
private volatile Boolean data;

Writer(final AtomicInteger integer, Boolean data) {
this.integer = integer;
this.data = data;
}

@Override public void run() {
while (!data) {
integer.incrementAndGet();
}
System.out.println("count " + integer.get() + " from WRITER!");
}
}

static class Reader implements Runnable {

private AtomicInteger integer;
private volatile Boolean data;

Reader(final AtomicInteger integer, Boolean data) {
this.integer = integer;
this.data = data;
}

@Override public void run() {
while (!data) {
if (integer.get() >= MAX_COUNT) {
data = true;
}
}
System.out.println("count " + integer.get() + " from READER!");
}
}
}

P.S:如果我将 boolean 值包装在一个对象中,它就可以工作。

最佳答案

您的 volatile boolean 数据不是引用,我认为您试图在这里建议,而是一个副本。所以Reader中的数据永远不会被设置为false。如果您在 Reader 中使用 Writer.data(并将其公开),这应该可以工作。

关于java - volatile 变量的更新值对其他线程不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55138786/

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