volatile的语义与实现 - 蓝易云

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 需要注意的是,虽然 `volatile`能保证单个共享变量的读写是原子性操作,但它无法保证复合操作的原子性。例如,i++操作就不是一个原子性操作,它包含读取、修改和写入三个步骤。如果需要保证复合操作的原子性,可以使用 `synchronized`关键字或者 `java.util.concurrent`包中的原子类。

在Java中,volatile是一个关键字,用于确保变量的可见性和顺序性。当一个字段被声明为 volatile时,Java虚拟机(JVM)会确保所有线程看到的这个变量的值都是一致的。此外,volatile还能防止指令重排序。

volatile关键字的语义:

  1. 可见性:当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去主存中读取新值。
  2. 顺序性:在Java内存模型中,允许编译器和处理器对指令进行重排序,但是当一个变量定义为volatile后,它会禁止指令级别的重排序,保证编写的程序按照我们的预期执行。

volatile关键字的实现:

volatile的实现依赖于底层的硬件和操作系统。在Java中,volatile的实现主要通过内存屏障(Memory Barrier)来完成。内存屏障是一种处理器指令,它能阻止特定类型的处理器重排序。在读取一个volatile变量时,会在读操作后插入一条读屏障指令;在写入一个volatile变量时,会在写操作前插入一条写屏障指令。这样就能保证volatile变量的可见性和顺序性。

需要注意的是,虽然 volatile能保证单个共享变量的读写是原子性操作,但它无法保证复合操作的原子性。例如,i++操作就不是一个原子性操作,它包含读取、修改和写入三个步骤。如果需要保证复合操作的原子性,可以使用 synchronized关键字或者 java.util.concurrent包中的原子类。

目录
相关文章
|
6月前
|
存储 缓存 安全
打工人,从 JMM 透析 volatile 与 synchronized 原理
打工人,从 JMM 透析 volatile 与 synchronized 原理
72 2
|
6月前
|
存储 缓存 安全
JMM学习笔记(二) 规则和volatile
JMM学习笔记(二) 规则和volatile
|
1天前
|
缓存 安全 Java
深入探索研究volatile
【10月更文挑战第16天】
13 7
|
4月前
|
存储 Java 程序员
Java内存模式以及volatile关键字的使用
Java内存模式以及volatile关键字的使用
36 0
|
缓存 Java 编译器
volatile的内存语义
volatile的内存语义
62 0
|
存储 缓存 Java
volatile的扩展分析(2)——happens-before 与 内存屏障
volatile的扩展分析(2)——happens-before 与 内存屏障
281 0
volatile的扩展分析(2)——happens-before 与 内存屏障
|
安全 Java
架构系列——面试必问:volatile的可见性、防止指令重排序以及不能保证原子性的解决方式
架构系列——面试必问:volatile的可见性、防止指令重排序以及不能保证原子性的解决方式
|
存储 缓存 安全
深入学习 volatile 的特性
深入学习 volatile 的特性
200 0
深入学习 volatile 的特性
|
Java 编译器
volatile关键词在多线程中的应用
volatile关键词在多线程中的应用
53 0
volatile关键词在多线程中的应用
|
存储 缓存 安全
基础篇:深入JMM内存模型解析volatile、synchronized的内存语义
总线锁定:当某个CPU处理数据时,通过锁定系统总线或者是内存总线,让其他CPU不具备访问内存的访问权限,从而保证了缓存的一致性
96 0