TinaMooN 2019-08-01 17:56 采纳率: 0%
浏览 575

java多线程数据可见性问题

下面这个程序缓存一致性问题,initflag第二个线程更改为true后,第一个线程while循环中如果没有输出那个代码或者加个同步块就跳不出循环。对于synchronized不应该是针对同一个监视器对象的话会保持内存可见吗? 再者initflag没有在同步代码块中包含,而是在while条件中,为什么线程1能够将自己的工作内存副本清除去主内存获取到线程2更改后的值呢?(不用volatile关键字)
package myTest;

public class ThreadMesiTest {
public static boolean initFlag = false;

public static void main(String[] args) throws InterruptedException {
    Thread thread1 = new Thread(new Runnable() {
        @Override
        public void run() {             
            while(!initFlag){
                System.out.println("进来了");
            }
            System.out.println("获取到了新值跳出循环了");
        }
    });
    thread1.start();
    Thread.sleep(5000);
    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            initFlag = true;
            System.out.println("更新啦falg的值");
        }
    });
    thread2.start();
}

}

  • 写回答

3条回答 默认 最新

  • 改不了ID 2019-08-01 18:50
    关注

    这个问题前几天回答过 可惜没被采纳
    原因是因为
    线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中
    线程获取锁时,JMM会把该线程对应的本地内存置为无效,从主内存中读取共享变量
    所以注意:
    System.out.println("进来了"); 中
    其实是有加synchronized锁的,所以子线程进入synchronized的时候会强制从主内存中读取共享变量,
    当读取到true时,就跳出

    评论

报告相同问题?

悬赏问题

  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化