Java之可见性与原子性

一 CPU与主存的交互
CPU有三级缓存,一般来说,一级缓存是单个核心独占的,二级缓存是两个核心共用,三级缓存是四个核心共用。所以,CPU的不同核心是可能用到的不是一个缓存。

二 可见性-两个线程一个写变量A,一个读取变量A
问题复现:线程1对变量A进行写操作放入主存,同时将该线程1(核心)所占用的缓存中的A的值也刷新。而线程2如果是要快速读取变量A,那线程2总是会读到自己所占缓存中的值,而线程2读变量A的缓存可能不是线程1写变量A的缓存,这样线程2读到的变量A就不是更新后的变量A,这就造成了变量的不可见。
解决方案:通过给变量A加volatile关键字,强制使线程读变量时不读缓存而是读主存中的变量。

二 原子性-两个线程都是对变量进行读写操作(i++)
i++操作是先从主存读取i,写操做加1后再赋值给i。
问题复现:线程1读取i加一后放回主存,线程2同样操作就有可能读取的不是线程1写后的变量i,因为线程2已经读取了变量在进行加一操作前不需要再去主存读取变量,这样就造成变量i实际上加一两次,结果只加了一次。
解决方案:i++读写操作是原子性的操作,即一个线程进行i++操作没有完成之前,另一个线程不能进行i++操作哪怕是读操作。
通过给变量i指定AtomicInteger类型,即可保证i读写操作的原子性。或者通过synchronized同步的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值