java lock可见性_reentrantlock如何保证可见性?

楼上有几楼的回答是正确的,有几楼甚至连题目都读不懂,就不要出来误人误己了。

前人之述备矣,我稍加整理。

lock和unlock,的确是通过volatile的state来实现的,而对这个state的写操作,也顺带实现了题主的问题,即:lock与unlock之间的代码(下文中简称临界区,虽然并不准确)对共享变量的修改,对其他线程可见。

这里可以从两个角度去解释。

第一个涉及一个内存屏障的问题,对volatile变量的写操作,前面会加上一个StoreStore内存屏障指令,其目的是限制多核运行环境对指令的部分重排序,而其效果是:确保state变量写操作之前的所有写操作对其他处理器可见(即flush到内存)

这里所有写操作包含临界区内所有尚未同步到主内存的所有共享普通变量的写操作。

第二个角度就是所谓的汇编指令LOCK系列,这个指令跟我们的lock方法不是同一个东西,它是处理器层面的指令。而对volatile变量的写操作,会紧跟一个LOCK指令。

LOCK前缀的指令具有如下效果:把写缓冲区中所有的数据刷新到内存中

注意,是所有的数据,可不仅仅是对state的修改哦~

我听闻还有些人说,lock不能像synchronize一样保证临界区的可见性,需要自己给所有变量加上volatile。笑尿!请自行参读并发编程大师Doug Lea用java编写的concurrent包部分类的源码,比如LinkedBlockingQueue:

(截图代码来自JDK 1.8.0_191)

这个head和last在进队出队的时候会被修改,并没有用volatile修饰,然而肯定是线程安全的。原因即上述。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值