工作内存和主存刷新时机是个很有意思的问题,网上有不少文章,但是写的都不是很全,所以这里亲自下场用代码实验
一、内存可见性:
内存可见性是并发编程中容易忽略的一个问题,但我认为他是一个非常重要的问题,只有对内存模型深刻理解才能发现这个问题。
主内存:线程共享内存,主要是堆和方法区;
工作内存:线程私有内存。相比于主存,工作内存离cpu更近性能更好,当线程访问公共变量时,会将变量copy一份到工作内存作为副本,后续都直接操作这个副本。
当然这里面核心的问题就是副本什么时候更新?什么时候重新从主存里读新值,什么时候把修改的数据写回主存。网上一般的回答都是cpu空闲的时候。
那实际上是这样吗,我们跑一下代码验证下。
二、demo验证:
1. 读时机
一般网上都用下面这个例子来验证
boolean flag = false;
@Test
public void testJMM() throws InterruptedException {
//读线程
new Thread(){
@Override
public void run() {
while (true){
//Thread.sleep(1);
//如果能读到更新后的值就回进入if
if(flag){
System.out.println("