Volatile原理与使用

  一问题:多线程模式下会产生数据读写的不一致问题:如图

解决方案:

  1. 总线加锁(粒度太大)
  2. MESI()
    1. 读操作:不做任何事情,把Cache中的数据读到寄存器
    2. 写操作:发出信号通知其他的CPU讲改变量的Cache line置为无效,其他的CPU要访问这个变量的时候,只能从内存中获取。

Cache line  CPU的cache中会增加很多的Cache line

二:Volatile关键字的语义

volatile作用:让其他线程能够马上感知到某一线程多某个变量的修改

  1. 保证可见性

对共享变量的修改,其他的线程马上能感知到

不能保证原子性  读、写、(i++)

  1. 保证有序性

重排序(编译阶段、指令优化阶段)

输入程序的代码顺序并不是实际执行的顺序

重排序后对单线程没有影响,对多线程有影响

Volatile

Happens-before

volatile规则:

对于volatile修饰的变量:

  1. volatile之前的代码不能调整到他的后面
  2. volatile之后的代码不能调整到他的前面(as if seria)
  3. 霸道(位置不变化)
  4. volatile的原理和实现机制(锁、轻量级)  
  5.   HSDIS   --反编译---汇编

      Java --class---JVM---》ASM文件

      Volatile  int  a ;

    Lock :a            

三:Volatile的使用场景

  1. 状态标志(开关模式)
  2. 双重检查锁定(double-checked-locking)饿汉模式
  3. 需要利用顺序性

四:volatile与synchronized的区别

  1. 使用上的区别

Volatile只能修饰变量,synchronized只能修饰方法和语句块

  1. 对原子性的保证

synchronized可以保证原子性,Volatile不能保证原子性

  1. 对可见性的保证

都可以保证可见性,但实现原理不同

Volatile对变量加了lock,synchronized使用monitorEnter和monitorexit  monitor  JVM

  1. 对有序性的保证

Volatile能保证有序,synchronized可以保证有序性,但是代价(重量级)并发退化到串行

  1. 其他

synchronized引起阻塞

Volatile不会引起阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值