volatile原理

作者: 蓝梅 | 来源:发表于2021-06-07 08:46 被阅读0次

一、并发编程特性

1、原子性:一个操作要么成功要么失败,中间不会中断

2、可见性:多个线程同时访问某个变量,当变量发生修改,其他线程可以立即看到被修改的值

3、有序性:代码按照代码的先后顺序执行

二、volatile可见性原理

volatile保证了可见性和有序性,可以有效的防止指令重排;

导致程序可见性问题,主要是因为当线程工作时,需要先把主内存中的变量拷贝(Load)到工作内存中,执行完成后,再写回(Store)到主内存中;所以这个中间就会存在多线程复写的问题;

主内存和工作内存

当加了volatile关键字,则通过"内存屏障"来防止指令重排;

1. lfence,是一种Load Barrier 读屏障

2. sfence, 是一种Store Barrier 写屏障

3. mfence, 是一种全能型的屏障,具备ifence和sfence的能力

4. Lock前缀,Lock不是一种内存屏障,但是它能完成类似内存屏障的功能。Lock会对CPU总线和高速缓存加锁,可以理解为CPU指令级的一种锁。它后面可以跟ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG等指令。

JVM提供的内存屏障:LoadLoad,StoreStore,LoadStore,StoreLoad;

可见性主要是通过MESI(修改 Modified  独享 Exclusive 共享Shared 无效 Invalid)机制来保证可见性;通过字节码可以看到,被volatile修饰的变量会有ACC_VOLATILE访问标识,通过汇编可以看到,执行时会lock

MESI

不同的硬件架构对MESI的实现不一样,一般CPU的三级缓存架构,读取缓存行(64byte)到cpu缓存,然后该CPU通过bus总线监控是否还有其他CPU读取该变量,通知也是通过总线通知;如果同时有其他线程对该变量进行修改,则会进行总线裁决;

相关文章

  • 互联网JAVA面试常问问题(三)

    一、volatile原理和使用场景 volatile 原理 volatile变量进行写操作时,JVM会向处理器发送...

  • volatile学习

    目录:1.volatile是什么2.volatile的作用3.volatile的原理4.volatile与sync...

  • Java并发机制底层实现原理-volatile

    章节目录 volatile的实现原理与应用 1.volatile的实现原理与应用 Java source code...

  • 并发编程艺术-2

    本篇文章主要介绍并发的底层实现原理:volatile , synchronized, 原子操作。 volatile...

  • volatile与synchronized的区别

    一、volatile volatile的原理在java中,被volatile声明的关键字,jvm会在翻译的时候在c...

  • java并发(二):深入分析volatile实现原理

    volatile的原理实现可以看这篇文章,真的是从硬件层面上说明了volatile怎样保证可见性。volatile...

  • JAVA线程安全之volatile

    volatile volatile原理是基于CPU内存屏障(Memory Barrier)指令实现的; 如果一个变...

  • volatile原理

    计算机内存模型 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由...

  • volatile原理

    通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volat...

  • volatile原理

    语义 不允许在缓存中操作volatile变量,且任何的写操作都会直接作用于内存,并且使得其他缓存行中的缓存失效。 ...

网友评论

    本文标题:volatile原理

    本文链接:https://www.haomeiwen.com/subject/afjceltx.html