24.volatile关键字的作用、volatile原理、可见性、内存屏障、volatile性能、transient
24.volatile关键字的作用
24.1.volatile原理
24.2.可见性
24.3.内存屏障
24.4.volatile性能
25.transient
24.volatile关键字的作用
volatile在Java并发编程中常用于保持内存可见性和防止指令重排序。
24.1.volatile原理
被volatile关键字修饰的变量,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache中。
而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。
volatile在Java并发编程中常用于保持内存可见性和防止指令重排序。内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态;防止指令重排:在基于偏序关系的Happens-Before内存模型中,指令重排技术大大提高了程序执行效率,但同时也引入了一些问题。
24.2.可见性
volatile保持内存可见性的特殊规则:read、load、use动作必须连续出现;assign、store、write动作必须连续出现;每次读取前必须先从主内存刷新最新的值;每次写入后必须立即同步回主内存当中。
也就是说,volatile关键字修饰的变量看到的随时是自己的最新值。在线程1中对变量v的最新修改,对线程2是可见的。
24.3.内存屏障
volatile防止指令重排的策略:在每个volatile写操作的前面插入一个StoreStore屏障;在每个volatile写操作的后面插入一个StoreLoad屏障;在每个volatile读操作的后面插入一个LoadLoad屏障;在每个volatile读操作的后面插入一个LoadStore屏障。
24.4.volatile性能
volatile的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
25.transient
https://blog.csdn.net/u012723673/article/details/80699029
https://www.cnblogs.com/tiantanglw/p/9142895.html
24.volatile关键字的作用、volatile原理、可见性、内存屏障、volatile性能、transient相关推荐
- volatile关键字的作用、原理
在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之 ...
- Java并发编程—volatile关键字(保证变量的可见性、有序性机制)
原文作者:Matrix海子 原文地址:Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程 ...
- java volatile关键字的作用_java volatile关键字作用及使用场景详解
1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...
- 【说一千道一万】volatile关键字的作用和synchronized的关系
[说一千道一万]volatile关键字的作用和synchronized的关系 volatile这个关键字在面试的时候通常会拿出来跟synchronized作比较,这也是比较基础的面试题目,这里自己总结 ...
- 一文搞懂Volatile关键字的作用
前言 Volatile关键字的作用主要有如下两个: 1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值. 2. 顺序一致性:禁止指令重排序. 一.线程可见性 我们先通过一个 ...
- 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题
深入理解并发内存模型||JMM与内存屏障 多核并发缓存架构 JMM内存模型 volatile 关键字的作用 JMM 数据原子操作 JMM缓存不一致的问题
- [实验]-从汇编代码来看volatile关键字的作用
★★★ 个人博客导读首页-点击此处 ★★★ 环境aarch64的交叉编译器 我们将C语言翻译成汇编代码,来看volatile关键字的作用 我们先看一段C语言代码 void udelay(uint64_ ...
- C语言volatile关键字的作用
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件告诉缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...
- 一句话概括volatile关键字的作用
Java内存模型 提到volatile就不得不说一下Java内存模型,因为volatile关键字就是为了弥补一下Java内存模型在多核多线程环境下的一个小缺陷(其实也不能说是缺陷,我只是一时想不到一个 ...
最新文章
- Bootstrap表单验证插件bootstrapValidator使用方法整理
- linux shell中小数的运算
- Asp.Net中验证控件简单分析
- 通过批处理文件自动安装apk到手机
- C# 时间函数(几个常用时间,程序运行计时,页面运行计时)
- PAT_B_1011_Java(15分)
- 计算机科学研究生规划,2019计算机考研备考:计算机科学与技术研究方向及复习规划...
- python童年_300行Python代码实现俄罗斯方块,致敬逝去的童年
- scala List
- 学习记录—HTML标签
- docker删除所有容器和镜像
- C#使用双堆栈创建队列
- python软件下载对电脑配置要求-python3批量统计用户电脑配置
- 【优化求解】基于matlab蚁群算法求解函数极值问题【含Matlab源码 1201期】
- Programer or Coder?
- VOIP Codec 三剑客之 ISAC/ILBC -- ISAC (3) High Band Encode 模块
- TIA博途中通过PN耦合器实现不同网段的PLC进行PROFINET通信的具体方法
- 2013年01月06日
- EditText过滤特殊符号
- 利用IDM下载QQ群文件
热门文章
- wordcloud库
- 离散免疫算法求解旅行商问题(源码实现)
- 人工智能的本质:最优化 (神经网络优化算法python手写实现)
- VTK:交叉点 PolyData 过滤器用法实战
- wxWidgets:wxSplitterWindow概述
- boost::typeindex::runtime_cast相关的测试程序
- boost::type_erasure::deduced相关的测试程序
- boost::mp11::mp_less相关用法的测试程序
- boost::fibers::algo::shared_work >用法的测试程序
- GDCM:DICOM文件转储图像标题信息的测试程序