Volatile关键字

Volatile关键字

① volatile的两个特点

  • 1 保证线程(CPU)之间的可见性;(也就是保证数据一致性)
    • 简单解释一下:一个线程将一个值的数值改变时,另一个使用该数值的线程能看到这种改变;
  • 2 禁止指令重排序(禁止乱序执行);
    • 这个和单例模式的DCL(Double  Check  Lock 双锁检查机制)相关,面试会问你创建对象的引用变量是否需要加volatile?肯定要加,涉及到对象的创建过程;

New对象过程:

  • 1 给对象实例分配内存;申请内存

  • 2 初始化对象的构造器;初始化

  • 3 将对象实例指向分配的内存空间(此时实例就非null了);建立关联

② volatile底层原理

  • 系统底层如何实现数据一致性?

    • 1 MESI如果能解决,就用MESI;

    • 2 如果不能,就用锁总线;(万能的)

  • 系统底层如何保证有序性?

    • 内存屏障;

    • 锁总线;

  • Volatile如何解决指令重排序?

    • 1 java代码层级:加volatile关键字;

    • 2 字节码层面:执行java代码,执行到volatile,字节码代码上加了一个ACC_VOLATILE关键字;

    • 3 JVM层级: 加屏障;屏障两边的指令不可以重排序;保障有序!

    • 4 hotspot实现:锁总线;

    • 5 更底层硬件实现,电信号:lock;

      JVM层级图示:

          

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

JVM--指令重排序+volatile关键字

volatile关键字1、volatile翻译为不稳定的,容易改变的。意思很明确,如果使用volatile定义一个变量,意思就是可能该变量改变频繁,并且设计到多线程访问问题。2、不过现在jdk的synchronized关键字性能已经足够出色,也提供了多种Lock类,因此volatile关键字能实现的功能jdk的同步方法都能够实

volatile实现可见性但不保证原子性

   volatile关键字:能够保证volatile变量的可见性不能保证volatile变量复合操作的原子性         volatile如何实现内存可见性:        深入来说:通过加入内存屏障和禁止重排序优化来实现的。对volatile变量执行写操作时,会在写操作后加入一条store屏