下面这个程序缓存一致性问题,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();
}
}