并发(二)——volatile理解

volatile关键字在并发编程中起到保证可见性和一定程度的有序性的作用,但不具备原子性。它通过内存屏障防止指令重排,避免多线程环境下出现数据错误。对比synchronized,volatile更轻量级,但使用时需谨慎,适用于变量不依赖当前值且无复杂不变式的场景。
摘要由CSDN通过智能技术生成

首先,确定一点就是volatile不具备原子性,但是拥有可见性,并且在一定程度上拥有有序性。
不具备原子性的原因:
因为可以认为是三个步骤

  1. 根据jmm理解,从主内存获取变量的值,并将其放入线程工作内存
  2. 工作区中的变量副本执行加一操作
  3. 再将工作内存写入主内存

其中线程一和线程二有可能同时执行1,然后再执行2,3步骤的时候,就会重复赋同样的值。

可见性和有序性原因
volatile拥有指令重排和内存屏障这两个特点。
主要是以下四个指令

  • LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
  • StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
  • LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
  • StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能
    其中StoreLoad保证了可见性,也就是更改后立即写入主内存;其他三个命令保证了有序性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值