gpt4 book ai didi

java - 如果读和写是原子的,为什么还需要 volatile

转载 作者:行者123 更新时间:2023-12-01 19:34:39 25 4
gpt4 key购买 nike

Oracle documentation指出:

Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).

现在我想知道为什么在下面的示例中需要使用 volatile 关键字来防止无限循环 - int 变量的更改应该是原子的,因此每个人都可以立即看到,不是吗?

public class HelloWorld
{
// This doesn't work as expected
private static int x = 0;
//Following would work: private volatile static int x = 0;

public static void main(String []args) throws Exception
{
Thread t1 = new Thread(() -> {
try
{
Thread.sleep(1000);
x = 1; //Should be atomic, right?
} catch (InterruptedException e) {}
});

System.out.println("Begin");
t1.start();

//The evaluation of the condition should also be atomic, right?
while(x == 0)
{
}

t1.join();
System.out.println("End");
}
}

最佳答案

读取和写入是原子的,只是线程之间不一定可见

volatile 是创建先发生关系所必需的:没有它,就无法保证一个线程中的写入与另一个线程中的读取之间的顺序。

通过标记变量 volatile ,保证一个线程中的写入对于所有后续读取都是可见的(直到下一次写入,obv):写入被提交到主内存,然后读取从主内存中读取,而不是缓存中保存的值。

关于java - 如果读和写是原子的,为什么还需要 volatile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58275602/

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