以前保证内存可见性都是使用volatile关键字,下面代码的执行结果,让我猜到了synchronized关键字可能会刷新线程的工作内存。
原来synchronized关键字也可以保证变量的内存可见性。因为,
1、线程解锁前,必须把共享变量的最新值刷新到主内存中;
2、线程加锁时,清空工作内存中共享变量的值,从而使共享变量是从主内存中重新读取最新的值(加锁与解锁需要统一把锁)
线程执行互斥锁代码的过程:
1.获得互斥锁
2.清空工作内存
3.从主内存拷贝最新变量副本到工作内存
4.执行代码块
5.将更改后的共享变量的值刷新到主内存中
6.释放互斥锁
所以这块代码,
new Thread(() -> {
while (i){
// System.out.println(i);
synchronized ("a"){
int s=0;
}
}
}).start();
Thread.sleep(1000);
i=false;
只要把注释的sout去掉,循环就会终止。