Volatile介绍

news/2024/5/6 6:45:38/文章来源:https://www.cnblogs.com/gustavo/p/16607223.html

介绍

volatile 是 Java 虚拟机提供的轻量级的同步机制,它可以保证可见性(缓存一致性协议)和有序性(禁止指令重排序,也就是通过内存屏障来实现),但是不保证原子性。


JMM

介绍

JMM 是一个抽象的概念,它描述的是一种规范。这些规范定义了程序中各种变量的访问规则。
JMM 定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。

规定

所有的共享变量都存储于主内存。这里所说的变量指的是实例变量和类变量,不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题。
每一个线程还存在自己的工作内存,线程的工作内存,保留了被线程使用的变量的工作副本。
线程对变量的所有的操作(读,写)都必须在工作内存中完成,而不能直接读写主内存中的变量。
不同线程之间也不能直接访问对方工作内存中的变量,线程间变量值的传递需要通过主内存中转来完成。

8种原子操作

lock(锁定):作用于主内存的变量,把一个变量标识为线程独占状态。
read(读取):作用于主内存变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
load(载入):作用于工作内存的变量,它把read操作从主存中得到变量放入工作内存的变量副本中。
use(使用):作用于工作内存中的变量,它把工作内存中的变量传输给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。
assign(赋值):作用于工作内存中的变量,它把一个从执行引擎中接受到的值赋值给工作内存的变量副本中,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store(存储):作用于工作内存中的变量,它把一个从工作内存中一个变量的值传送到主内存中,以便后续的write使用。
write(写入):作用于主内存中的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。
unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。

图示


Happens-Before 原则

介绍

happens-before 原则,是 JMM 中非常重要的一个原则,它是判断数据是否存在竞争、线程是否安全的主要依据,依靠这个原则,我们可以解决在并发环境下两个操作之间是否存在冲突的所有问题。JMM 规定,两个操作存在 happens-before 关系并不一定要 A 操作先于B 操作执行,只要 A 操作的结果对 B 操作可见即可。

内容

程序顺序原则:一个线程内保证语义的串行性
volatile规则:volatile变量的写操作,先发生于读操作,这保证了volatile变量的可见性
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C,那么A必然先于C
线程的start()方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt)先于被中断线程的代码
对象的构造函数执行、结束先于finalize()方法


volatile与内存屏障

内存屏障

内存屏障其实也是一种JVM指令,Java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存屏障指令,通过这些内存屏障指令来禁止特定的指令重排序。
另外内存屏障还具有一定的语义:内存屏障之前的所有写操作都要回写到主内存,内存屏障之后的所有读操作都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)。因此重排序时,不允许把内存屏障之后的指令重排序到内存屏障之前。

内存屏障的功能

1 确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2 强制将对缓存的修改操作立即写入主存,利用缓存一致性机制,并且缓存一致性机制会阻止同时修改由两个以上CPU缓存的内存区域数据;
3 如果是写操作,它会导致其他CPU中对应的缓存行无效。

[☛ 重点:这里就是配合总线嗅探的地方了,通过内存屏障保证有序性的同时也保证修改的变量要及时写回主内存]

内存屏障种类

Volatile读写内存屏障详情

StoreStore
Volatile 写
StoreLoad (保证写入对所有处理器可见)

Volatile 读
LoadLoad
LoadStore


为什么无法保证原子性?

在插入内存屏障之前的操作并不是原子性的。多个线程可以修改,所以无法保证原子性。


常见应用

状态标记

public class VolatileDemo {private static volatile boolean isOver = false;public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (!isOver) }});thread.start();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}isOver = true;}
}

double check(单例模式)

public class SingletonExample5 {// 私有构造函数private SingletonExample5() {}// 单例对象 volatile + 双重检测机制 -> 禁止指令重排private volatile static SingletonExample5 instance = null;// 静态的工厂方法public static SingletonExample5 getInstance() {if (instance == null) { // 双重检测机制synchronized (SingletonExample5.class) { // 同步锁if (instance == null) {instance = new SingletonExample5();}}}return instance;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_2329.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

monodepth2学习-KITTI数据集内容

KITTI数据集介绍 monodepth2采用KITTI数据集进行训练,KITTI数据集主要是针对自动驾驶领域的图形处理技术,主要应用在评测立体图像(stereo)、光流(optical flow)、3D物体检查等计算机视觉领域。KITTI数据集采用配备有两个灰度摄像头,两个彩色摄像头和一个Velodye 64激光雷…

代码审计-PHP反序列化漏洞

什么是序列化序列化可以实现将对象压缩并格式化,方便数据的传输和存储。 为什么要序列化? PHP 文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有了对象序列化,实现对象的长久存储,对象序列化之后存储起来,下次调用时直接调出来反序列化之后就…

世事无常,人生有定,此乃时也、运也、命也

参考: https://www.163.com/dy/article/H6NVOULE0528OPI5.html“万般皆由命,半点不由人。”半生已过,红尘辗转,才真正明白人的寿命与财富,在你来到人世间的那一刻上天就安排好了,半点由不得我们自己。正所谓“世事无常,人生有定,此乃时也、运也、命也!” 所谓命者。先…

三次握手,四次挥手

三次握手 连接建立阶段: 第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段。其首部中:SYN=1,seq=x。 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。 第三次握手:客户端收到确认报文之后…

操作系统学习笔记4 | CPU管理 多进程图像

操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。操作系统通过多进程图像实现对CPU的管理。所以多进程图像是操作系统的核心图像。操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。而通过学习笔记3的简史回顾,操作系统通过多进…

Hadoop十九

HDFS API操作在Windows上操作hadoop,需要添加hadoop依赖,我的hadoop是3.3.1版本的,我用的依赖是3.2.0的,需要配置环境变量 PATH添加如下路径: 然后双击依赖中的一闪而过就是成功的。 在maven项目中添加如下依赖<dependencies><!-- https://mvnrepository.com/a…

框架-逻辑层(逻辑层简介和注册程序)

逻辑层简介 小程序逻辑层 小程序开发框架的逻辑层是使用JavaScript编写的。 逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈。 在 JavaScript 的基础上,微信做了一些修改,以方便地开发小程序。增加 App 和 Page 方法,进行程序和页面的注册。 增加 getApp和g…

德飞莱 C51 学习笔记

《电子元件基础教程》 :数字集成电路 从结构上分为 : TTL 型 和 CMOS 型 《跟我学数字电子技术》: 数字电路分为 组合逻辑电路 和 时序逻辑电路

golang中GOPATH、GOROOT、GOBIN不生效等相关问题

比较重要的三个配置:GOPATH、GOROOT、GOBIN GOPATH : go项目开发的工程目录 GOROOT: go安装所在的目录 GOBIN: go项目编译完二进制程序目录 不生效问题,其实应该好好检查是否上面相关路径配置是否正确 编辑vim ~/.bash_profile 添加以下3个配置export GOROOT="/usr/loca…

高性能服务器之事件处理模式

I/O模型 对于一个套接字上的输入操作,通常存在以下两个步骤:等待分组到达,被复制到内核缓冲区中 将数据从内核缓冲区复制到应用进程的缓冲区中对于上述过程,在 Unix 下有 5 中基本的 I/O 模型可以对其进行处理:阻塞式 I/O 非阻塞式 I/O I/O 复用 信号驱动 I/O 异步 I/O1. …

算法总结

1.每日温度题(一道关于栈的问题) 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 输入: temperatures = [73,74,75,71,69,72,76,73] 输出…

国内可使用chatGPT的十三种方式

国内AI 1. 开放猫 Chat机器人https://mirrorchat.extkj.cn/ chat机器人&#xff1a; Chat机器人https://mirrorchat.extkj.cn/ 3.免费学习测试 免费学习测试https://chat.wuguokai.cn/#/chat/1683348236237 4.AI文本工具站 AI文本工具站一个用于提高工作效率的文本工具网站,应用…

ChatGPT Plus用户专享:86款高效功能插件,详尽安装与使用全攻略

在前天的文章中&#xff0c;我们介绍了 ChatGPT 开放的全新模式 Web Browsing&#xff08;网页浏览&#xff09;&#xff0c;启用后 ChatGPT 就可以开始上网&#xff0c;收集最新的互联网资料进行作答。 其他关于chatgpt使用方面&#xff1a;请访问&#xff1a; 链接&#xf…

ChatGPT自然语言处理的新里程碑

ChatGPT中文网是一个面向中国用户的聊天机器人网站&#xff0c;旨在为国内用户提供一个自然的环境、有趣、实用的聊天体验。它使用最新的自然语言处理技术来帮助用户更好地理解他们的聊天对话&#xff0c;还可以帮助用户解决日常生活中的问题&#xff0c;提供有趣的谈话内容以及…

国内版ChatGPT最全使用方法及使用用途技巧汇总

ChatGPT人工智能技术的出现确实会让一些人担心自己的工作会不会被取代。但实际上&#xff0c;人工智能技术只会替代那些可以被程序自动化的重复性、标准化、无脑力的工作&#xff0c;而对于需要人类创意、想象力和复杂思维的工作来说&#xff0c;AI人工智能技术的发展对于人类来…

ChatGPT和Midjourney王炸组合,开启AI新时代

目录 序言 一&#xff1a;使用ChatGPT进行对话 二&#xff1a;调用newbies robot 三&#xff1a;举例说明 四&#xff1a;付费和使用限制 序言 随着人工智能技术的不断发展&#xff0c;越来越多的人开始使用人工智能工具来创作图画。在这里&#xff0c;我将分享如何结合Ch…

一文带你读懂什么是ChatGPT?

文章目录 前言ChatGPT的发展历史ChatGPT初体验ChatGPT的未来展望提高聊天机器人的对话能力改进聊天机器人的生成能力提高聊天机器人的个性化能力加强聊天机器人的安全性 总结福利彩蛋 前言 橙子送书第1期&#xff01;文末参与活动&#xff0c;即可包邮到家。为即将或正在使用Ja…

【ChatGPT】使用大型语言模型 (LLM) 进行特定领域语言(DSL)生成

使用大型语言模型 (LLM) 进行特定领域语言(DSL)生成,markdown格式,10000字左右。大纲如下:背景介绍,LLM的核心能力,DSL的本质特征,怎样 使用LLM 结合外部知识和领域特定约束,通过 Backus-Naur Form(BNF) 表示进行学习,实现 DSL 的生成。给出具体的实验实例。 文章目录…

漫画:ChatGPT的应用场景有哪些?

第一&#xff0c;文案创作 ChatGPT可以通过用户输入的提示&#xff0c;创作出相应的文本内容。 媒体作者可以给ChatGPT提出要求&#xff0c;让ChatGPT根据某一主题生成的媒体文案。 广告策划人员可以把要推广的商品信息输入给ChatGPT&#xff0c;让ChatGPT针对此商品生成一段广…