volatile关键字实现

[外链图片转存失败(img-EIsp5wvJ-1564902041060)(C:\Users\MIMO\AppData\Roaming\Typora\typora-user-images\1564833330697.png)]

Volatile 关键字实现原理

线程的工作空间是 CPU寄存器和cache的抽象描述

CPU修改数据 内存数据的步骤 :

  1. 把内存中的数据读到cache中
  2. 在cache中更新数据
  3. 把更新的数据刷新到缓存

数据的不一致问题

解决方案 :

  1. 总线加锁(粒度太大)

  2. MESI()

    ​ a. 读操作: 不做任何操作,将cache中的数据读到寄存器中

    ​ b. 写操作 : 发出信号通知其他的CPU将该变量的cache line置为无效 ,其他CPU要访问这个变量的时候,只能从内存中获取

    Cache line: CPU的cache中会增加很多的cache line,然后将cache 里呢 与对象对应起来

  3. Java内存模型

在这里插入图片描述

  1. 主存中的数据所有线程都可以访问

  2. 每个线程都有自己的工作空间(本地内存)

  3. 工作空间数据 : 局部变量 .内存的副本

  4. 线程不能直接修改内存中的数据,只能读到工作空间修改>>寄存器 修改完成后返回刷新到内存

Volatile 关键字语义分析

volatile 作用 ,让其他线程能够马上感知到某一线程的修改

(1) 保证了可见性

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

不能保证原子性 读.写 (i++) > 多个原子性操作合在一起变为非原子性

(2) 保证有序性

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

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

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

volatile 规则 :

​ 对于volatile修饰的变量

​ (1) volatile 之前的代码不能调整到它的后面

​ (2) volatile 之后的代码不能调整到它的前面

​ (3) 霸道(位置不变化)

(3) volatile的原理和实现机制(锁,轻量级的锁)

java > class > JVM > ASM文件

汇编中

​ volatile int a = 0

lock : a

Volatile的使用场景

(1)将其作为对线程操作的标志,控制线程的运行

(2) 双重锁 (double -check -locking)

单例模式

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

volatile 与 synchronized的区别

(1) 使用上的区别

volatile 只能修饰变量 ,synchronized可以修饰方法和语句块

(2) 对原子性的保证

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

(3) 对可见性的保证

均可保证可见性

volatile 对变量加了lock ,synchronized使用monitor 对应的指令 >> monitorEnter monitorexit

(4) 对有序性的保证

volatile 能保证有序性 ,synchronized 可以保证有序性,但是代价(重量级)并发变为串行

(5) 其他

synchronized 引起线程阻塞

volatile 不会

// volatile 只能通知其他线程我正在修改变量,并通知它到内存中去读,但是并不能保证内存中的数据是修改后的新值,有可能读的是旧值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值