gpt4 book ai didi

java - 为什么对非 volatile 的写入对主线程可见?

转载 作者:行者123 更新时间:2023-12-01 17:41:03 25 4
gpt4 key购买 nike

想象一下以下程序。

class Main {


static class Whatever {
int x = 0;
}


public static void main(String[] args) {
Whatever whatever = new Whatever();

Thread t = new Thread(() -> {
whatever.x = 1;
});
t.start();
try {
t.join();
}
catch (InterruptedException e) {
}

System.out.println(whatever.x);
}
}

主线程已缓存whatever并且x设置为0。另一个线程启动,缓存whatever并将缓​​存的x设置为1

输出为

1

所以主线程已经看到了写入。这是为什么?

为什么要对共享缓存进行写入以及为什么主线程会使其缓存失效以从共享缓存中读取?为什么这里不需要 volatile

最佳答案

因为主线程加入了它。看JLS 中的 17.4.5:

All actions in a thread happen-before any other thread successfully returns from a join() on that thread.

顺便说一句,没有发生之前并不一定意味着某些东西不可见。

关于java - 为什么对非 volatile 的写入对主线程可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61298220/

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