通过不同的线程同时读取和更改变量

Mik*_*own 3 java concurrency multithreading thread-safety thread-synchronization

我感兴趣的是一个线程正在等待while循环中变量的变化:

while (myFlag == false) {
    // do smth
}
Run Code Online (Sandbox Code Playgroud)

它重复无数次.

与此同时,另一个线程更改了此变量的值:

myFlag = true;
Run Code Online (Sandbox Code Playgroud)

如果此变量不是volatile,读者线程是否可以看到更改另一个线程中变量值的结果?一般来说,据我所知,它永远不会发生.还是我错了?然后在什么情况下,第一个线程可以看到变量的变化并退出循环?这可能不使用volatile关键字吗?在这种情况下,处理器缓存的大小是否起作用?

请解释并帮助我理解!先感谢您!!

Jon*_*eet 8

如果此变量不是volatile,读者线程是否可以看到更改另一个线程中变量值的结果?

可能是,是的.只是它不会明确地看到变化.

一般来说,据我所知,它永远不会发生.

不,事实并非如此.

您正在写一个变量,然后在另一个线程中读取它.您是否看到它将取决于所涉及的确切处理器和内存架构.如果不涉及任何内存障碍,您无法保证看到新的价值 - 但您肯定不会保证不会看到它.