并发专题-Volatile关键字实现原理

1、认识volatile关键字
程序举例
用一个线程读数据,一个线程改数据
存在数据的不一致性

2、机器硬件CPU与JMM
(1)CPU Cache模型
在这里插入图片描述
在这里插入图片描述

程序的局部执行原理:使用某数据时,会将这一区域的数据全部加载

(2)CPU缓存的一致性问题
在这里插入图片描述

CPU修改内存中的共享数据的步骤:
1,从内存中加载数据到Cache,寄存器
2,CPU修改修改寄存器中的数据,然后更新到cache
3,把更新额数据结果刷到内存

数据不一致性问题,A线程修改共享变量,B读取的结果可能是修改前的,也有可能是修改后的。
数据不一致的解决方案:
1)总线加锁(粒度太大)
2)MESI(缓存一致性协议)
a. 读操作:不做任何事情,把Cache中的数据读到寄存器
b. 写操作:发出信号通知其他的CPU将该变量的Cache line置为无效状态,其他的CPU要访问这个变量的时候,只能从内存中获取。
Cache line CPU的cache中会增加很多的Cache line
在这里插入图片描述

(3)Java内存模型
在这里插入图片描述
1)主存中的数据所有线程都可以访问(共享数据)
2)每个线程都有自己的工作空间,(本地内存)(私有数据)
3)工作空间数据:局部变量、内存的副本,引用数据类型存储的是地址。
4)线程不能直接修改内存中数据,只能读到工作空间来修改,修改完成后刷新到内存
在这里插入图片描述

3、Volatile关键字的语义分析
volatile作用:对共享变量的修改让其他线程能够马上感知到某一线程多某个变量的修改(变量的修改不具有原子性,必须写到内存后其他线程才可以感知到)
(1)保证可见性(JMM控制通过将cacheline置为无效来实现)
对共享变量的修改,其他的线程马上能感知到
不能保证原子性 读、写、(i++)
(2)保证有序性
重排序(编译阶段、指令优化阶段)
输入程序的代码顺序并不是实际执行的顺序
重排序后对单线程没有影响,对多线程有影响
Volatile
Happens-before
volatile规则:
对于volatile修饰的变量:
(1)volatile之前的代码不能调整到他的后面
(2)volatile之后的代码不能调整到他的前面(as if seria)
(3)霸道(位置不变化)

Int i=0;
Int a=3;
Int b=5;
Volatile Int j=3;
Int i=0;
Int a=3;
Int b=5;


Int m=i+j;
I++;
J++;

(3)volatile的原理和实现机制(锁、轻量级)
HSDIS 汇编工具,可以进行反编译,也可以进行汇编
Java --class—JVM—》ASM文件
Volatile int a ;
Lock :a

4、Volatile的使用场景
(1)状态标志(开关模式)

public class ShutDowsnDemmo extends Thread{
    private volatile boolean started=false;
    @Override
    public void run() {
        while(started){
            dowork();
        }
    }
    public void shutdown(){
        started=false;
    }
}

(2)双重检查锁定(double-checked-locking)
DCL

public class Singleton {
    private volatile static Singleton instance;
    public static Singleton getInstance(){
        if(instance==null){
            synchronized (Singleton.class){
                instance=new Singleton();
            }
        }
        return instance;
    }
}

(3)需要利用顺序性

5、volatile与synchronized的区别
(1)使用上的区别
volatile只能修饰变量,synchronized只能修饰方法和语句块
(2)对原子性的保证
synchronized可以保证原子性,volatile不能保证原子性
(3)对可见性的保证
都可以保证可见性,但实现原理不同
volatile对变量加了lock,synchronized使用monitorEnter和monitorexit monitor JVM
(4)对有序性的保证
volatile能保证有序,synchronized可以保证有序性,但是代价(重量级)并发退化到串行
(5)其他
synchronized引起阻塞
volatile不会引起阻塞

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值