天明伴雨晴 2022-01-25 01:03 采纳率: 50%
浏览 54
已结题

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的变化陷入死循环

这是为什么

  • 写回答

2条回答 默认 最新

  • 日落西风又在吹 2022-01-25 10:04
    关注
    1. 变量不存在可见性,对于其他线程修改了,未刷新主内存并未通知工作线程重新获取到工作空间中
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月26日
  • 已采纳回答 5月18日
  • 创建了问题 1月25日