java关键字synchronized的内存可见性

以前保证内存可见性都是使用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去掉,循环就会终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值