并发编程的“淑女剑”volatile

并发编程的“淑女剑”volatile

首页角色扮演君子玉女剑更新时间:2024-07-08

(程序)猿/媛儿友们,当你听到volatile,你想到什么?

一提到volatile就想到面试?也对,面试的时候经常问到volatile相关的知识。其实在并发编程圈,volatile就像一把"玉女剑",地位不容小觑。

今天作者就和大家一块儿来揭揭volatile的老底儿。


volatile的家族地位如何?

首先我们先了解下volatile的出身,在JUC(java.util.concurrent.*)家族中的地位如何。

下方第一排左一,妥妥的祖师奶级别哇!但凡你有所耳闻的概念,像是AQS啦,原子变量类啦,都是基于volatile实现。

更别说喜闻乐见的线程池以及锁机制,更是直接或间接依赖他。


volatile的生态关系怎么样?

他和synchronized什么关系?

功能上,volatile是轻量级的synchronized。与synchronized不同的是,他更为优雅,通过保证共享变量的"可见性",避免了上下文切换和调度。

实现上,volatile告诉JVM工作内存的数据存在不确定的情况,需要从主内存中读取数据。

常用在变量上,保证可见性,不保证原子性。volatile不会阻塞线程。

受happens-before规范约束影响,修饰的指令不会被优化,即指令不会被重排序。

synchronized后续会单独讲解。

他和atomic什么关系?

乍一听这个题目,有点儿懵,感觉两者不在一个次元。

首先应当确认atomic是一个概念,表示原子性。基于硬件(处理器)层面的实现策略有两种,其中Java中的CAS采取了其中的"锁缓存"策略。

至此,你可以发现CAS和volatile才是一个次元,见上图下方第一排左二。

不难得出结论,volatile不具备原子性,需要借助CAS或基于CAS实现的synchronized或者lock锁、或者atomic类来实现原子性。

CAS后续会单独讲解。


volatile的底层是怎么实现的?

我们直接转换成汇编语言,深入到处理器层面解读。volatile修饰的变量进行写操作时,其汇编语言多了一个关键字lock。基于硬件层面的"锁缓存"策略,lock前缀指令保证多处理环境下能够独享内存。

1 从共享内存(主内存)复制值到本地内存(工作内存)。

2 执行i 代码,更新本地内存(工作内存)的值。

3 JVM向处理器发送一条lock指令,将本地内存(工作内存)的值刷新到共享内存(主内存)。

4 其他处理器通过总线嗅探,发现有处理器写共享内存(主内存)的地址后,将本地内存置为无效。

4其他处理器下次更新时,强制从共享内存中拉取数据。


volatile的经典使用场景?

既然volatile不保证复合操作如i 的原子性,那就应用在非复合操作上呗。例如多线程之间共享的布尔Boolean值,完全可以使用volatile这样的轻量级锁来保证安全。

此外,volatile还有一个经典的应用场景不得不提。"单例模式"你一定不陌生。

分为饥汉、饱(饱)汉、懒加载等多种实现方式。其中饱(饱)汉的实现方式下有个双重锁校验机制。

其意图是将本来用于修饰method方法的synchronized后移,在确定instance实例对象为null空的情况下再使用。

但其实这里有个隐患,源于只考虑了原子性atomic,没有考虑可见性有序性,指令会重排序。

先厘清一个概念,as-if-serial语义,说的是单线程下,指令优化(重排序)的最终结果不变。显然上面的场景是运行在多线程环境下,那么上面存在指令优化(重排序)吗?会。

new Object(对应上图的new LazySingleton())操作分为两部分,一是创建内存,二是指针指向内存地址。注意,这两个指令无论哪个先执行,单线程情况下都不影响最终的结果,即满足as-if-serial语义。

多线程情况下,如果指针指向内存地址的指令happens-before创建内存的指令,那么将出现问题,提示对象还没有被创建。

所以上述代码应该做如下修改:

多线程情况下,volatile保证了指令不会被优化(重排序)。


review(回顾)一下!

综上,如果现在问你提到volatile你会想到什么?对哒,可见性,有序性(多线程下指令不会重排序),不支持原子性。并发情况下,和CAS更配哦。

正所谓"一阴一阳之谓道",我们今天带大家认识了并发编程的祖师爷volatile,你已经手握一柄宝剑"玉女剑"。

下个专题我们来讲并发编程的祖师爷CAS,想不想再获得一柄"君子剑"呢?

如果文章读的不过瘾,后续可以观看我录制的视频哦,关注我吧。

本文人物图片来自网络,其他图片均为原创

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved