java 缓存一致性问题

最近看书看到了java缓存一致性的问题 是这些了一段代码


```java
`static int val = 0;
    public static void main(String[] args) throws Exception{
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (val < 5){
                    if(val != 0 ){
                        System.out.println(val);
                    }
                }
                System.out.println("over");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <5; i++){     ​
                   ​//val = i;//val ++;try {
                       ​TimeUnit.SECONDS.sleep(2);
                   ​} catch (InterruptedException e) {
                       ​e.printStackTrace();
                   ​}
               ​}
           ​}
       ​}).start();
   ​}

``
当第二条线程val ++ 注释去掉,第一个线程就能看见val的变化

当第二条线程val=i注释去掉,第一个线程就看不见val的变化陷入死循环

这是为什么

  1. 变量不存在可见性,对于其他线程修改了,未刷新主内存并未通知工作线程重新获取到工作空间中

第二个线程当i = 4的时候,一个是for循环i++一个是val++,for循环i++后i等于5了循环结束,没有执行val = i,val永远是4,所以val = i会死循环