为什么线程一可以读到线程二的非volatile值?请大佬指教。
public static volatile int i = 0;public static volatile int j = 0;
private static boolean aa = false;
/**
* 可见性 * * @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
//线程一
new Thread(() -> {
System.out.println("thread 1 run.....");
while (!aa) {
int b = i;
} System.out.println("thread 1 end.....");
}).start();
TimeUnit.SECONDS.sleep(2);
//线程二
new Thread(() -> {
aa = true;
System.out.println("更新aa为true");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
} }).start();
}
//结果,线程二更新完aa变量,线程一跳出了循环。
回答
线程二等待5s的时候,线程一就能读取到线程二更新的非volatile的值,想请教一下是哪个操作导致线程二的 aa = true; 刷新到主内存/造成缓存失效的?
循环读取volatile 变量 对volatile修饰的变量每次都会从主内存读取
主要是因为 i aa 在同一个缓存行中 每次读取都会附带更新aa
所以 等线程二 更新aa 这个不会立即刷新 主要是后面的println()语句中加锁了 会强制刷新该线程
public void println(boolean x) { synchronized (this) { //这里会刷新当前线程工作空间 aa就写到主内存中 然后就读取跳出
print(x);
newLine();
}
}
以上是 为什么线程一可以读到线程二的非volatile值?请大佬指教。 的全部内容, 来源链接: utcz.com/a/84214.html