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变量,线程一跳出了循环。
循环读取volatile 变量 对volatile修饰的变量每次都会从主内存读取
主要是因为 i aa 在同一个缓存行中 每次读取都会附带更新aa
所以 等线程二 更新aa 这个不会立即刷新 主要是后面的println()语句中加锁了 会强制刷新该线程