【面试:并发篇25:多线程:volatile】可见性
00.前言
如果有任何问题请指出,感谢。
01.介绍
可见性是值,一个线程对共享变量修改另一个线程可以看到最新的结果
02.例子
@Slf4j(topic = "c.Test32")
public class Test32 {
static Boolean stop = false;
public static void main(String[] args) {
new Thread(()->{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
stop = true;
log.debug("把stop修改为true");
}).start();
foo();
}
static void foo(){
int i=0;
while (!stop){
i++;
}
log.debug("stopped...c:{}",i);
}
}
结果
程序没有结束:
18:44:55.991 c.Test32 [Thread-0] - 把stop修改为true
解释
上述代码表达的意思是,我们创建了一个stop成员变量默认为false 我们创建一个方法foo 它里面有一个while循环 只有stop为true时 它才能跳出循环,然后 我们创建了一个线程 我们在它里面使stop变为true,我们使线程在0.1s后再执行stop=true,所以理论上来说 我们在0.1s后 while循环就应该退出并打印循环次数了,可是我们却发现 这个循环并没有退出 也就是,对于while循环来说此时stop还是false
03.对于上述例子的解释
错误解释
在网上有这么一种解释,下图为JMM(java内存模型)图,
注意:下文中的高速缓存 副本 工作内存指的是一个东西
即每个线程对共享变量进行操作时 这个线程就会把主存中的共享变量复制一份到高速缓存中,之后线程的每次操作都是在高速缓存中执行 加快