Volatile关键字

Wesley13
• 阅读 486

Volatile关键字

① volatile的两个特点

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

New对象过程:

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

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

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

Volatile关键字

② volatile底层原理

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

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

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

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

    • 内存屏障;

    • 锁总线;

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

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

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

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

    • 4 hotspot实现:锁总线;

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

      JVM层级图示:

          Volatile关键字

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
浩浩 浩浩
3年前
JVM--指令重排序+volatile关键字
volatile关键字1、volatile翻译为不稳定的,容易改变的。意思很明确,如果使用volatile定义一个变量,意思就是可能该变量改变频繁,并且设计到多线程访问问题。2、不过现在jdk的synchronized关键字性能已经足够出色,也提供了多种Lock类,因此volatile关键字能实现的功能jdk的同步方法都能够实
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
volatile实现可见性但不保证原子性
   volatile关键字:能够保证volatile变量的可见性不能保证volatile变量复合操作的原子性         volatile如何实现内存可见性:        深入来说:通过加入内存屏障和禁止重排序优化来实现的。对volatile变量执行写操作时,会在写操作后加入一条store屏
Wesley13 Wesley13
2年前
Volatile概述
Volatile概念volatile是一个特征修饰符(typespecifier)。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。——百度百科所以呢它主要是两个作用:一个是
Wesley13 Wesley13
2年前
Java多线程之volatile详解
目录:什么是volatile?JMM内存模型之可见性volatile三大特性之一:保证可见性volatile三大特性之二:不保证原子性volatile三大特性之三:禁止指令重排小结1.什么是volatile?答:volatile是java虚拟机提供的轻量级的同步机制(
Wesley13 Wesley13
2年前
Java并发编程原理与实战十二:深入理解volatile原理与使用
volatile:称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的。可见:一个线程修改了这个变量的值,在另一个线程中能够读取到这个修改后的值。synchronized除了线程之间互斥之外,还有一个非常大的作用,就是保证可见性。以下demo即保证a值的可见性。首先来看demo:!复制代码(https://oscimg.osc
Wesley13 Wesley13
2年前
JAVA 并发包
Java.Utril.ConcurrentVolatile关键字避免java虚拟机指令重排序,保证共享数据修改同步,数据可见性。volatile相较于synchronized是一种比较轻量级地同步策略,但不具备互斥性,不能成为synchronized的替代,不能保证原子性。
Wesley13 Wesley13
2年前
Java多线程(二)
\恢复内容开始一,volatile关键字当多个线程操作共享数据时,可以保证内存中的数据可见性相较于synchronized关键字:1,不具备“互斥性”2,不能保证变量的原子性二,原子变量volatile保证内存可见性CAS(CompareAndSwap)算法保证数据的原子性内存值V预估值A更新值
Wesley13 Wesley13
2年前
Java 多线程:volatile关键字
概念volatile也是多线程的解决方案之一。\\volatile能够保证可见性,但是不能保证原子性。\\它只能作用于变量,不能作用于方法。当一个变量被声明为volatile的时候,任何对该变量的读写都会绕过高速缓存,直接读取主内存的变量的值。如何理解直接读写主内存的值:回到多线程生成的原因(Java内存模型与