当前位置: 首页 > news >正文

Java volatile

Volatile

作用:保证变量的可见性,有序性(禁止指令重排序)。不保证原子性。

如何保证可见性的?

场景:每个 线程 下都有一块 工作内存。要使用变量需要从 主内存 中把 变量 读取出来,使用完成后写入到主内存。如果这个时候在 工作内存 中修改,还没有来得及写入 主内存,其他的线程从主内存中读取又读取到旧的数据了,那么这个时候就是不可见的。

Volatile 是如何做的?

原理:

  • 当对 volatile 变量进行 写操作 的时候,会立马将工作内存中的值写入到主内存中。
  • 当对 volatile 变量进行 读操作 的时候,会将工作线程内的变量值置为无效,然后重新从主内存中获取。

image-20240827235947300

禁止指令重排序

指令重排序 通常指的是 编译器运行时环境 对程序代码中指令的顺序进行调整。

这个是编译时 Jvm 对代码的一个优化,他认为这部分命令重新排序后执行效率会更高。

多核 CPU 也会对指令进行重排序以实现更好的并行处理。

volatile 作用:表示该变量的操作禁止重排序这种优化。使得指令可以按照编码顺序执行,避免在并行情况下的逻辑紊乱。

样例

public class VolatileDemo {private static  boolean flag = true;public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println("Start");while (flag) {}System.out.println("End");}).start();// 休眠一秒TimeUnit.SECONDS.sleep(1);flag = false;}
}

image-20240828001013953

程序一直没有结束,这就是主线程修改后其他线程不可见导致的。

加下 volatile 关键字后,能够正常结束了。

    private static volatile boolean flag = true;

image-20240828001002576

不加 Volatile 就不能保证可见性吗?

答案:不是!!!

还有那些情况可以让变量可见呢?

synchronized 互斥锁

原理:在获得互斥锁之后,会清除工作内存,重新从主内存中获取值到工作内存中,使用完成后将工作内存的值写到主内存,释放互斥锁。

修改样例

// 去掉 volatile
private static  boolean flag = true;public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println("Start");while (flag) {// 增加打印日志System.out.println(flag);}System.out.println("End");}).start();TimeUnit.SECONDS.sleep(1);flag = false;
}

image-20240828001855814

这样也能正常结束了。这是因为 System.out.println() 内部使用了 synchronized 关键字。

Sleep 休眠

让线程休眠触发 cpu 切换线程的机制,这样不可见的线程再重新唤醒后会重新从主内存中读取值

public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println("Start");while (flag) {try {// 让不可见的线程休眠一下,cpu唤醒后会重新从主内存中读取值Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("End");}).start();TimeUnit.SECONDS.sleep(1);flag = false;
}

image-20240828002440759

相关文章:

Java volatile

Volatile 作用:保证变量的可见性,有序性(禁止指令重排序)。不保证原子性。 如何保证可见性的? 场景:每个 线程 下都有一块 工作内存。要使用变量需要从 主内存 中把 变量 读取出来,使用完成后写…...

一条sql是如何执行的详解

一条sql是如何执行的详解 1. SQL 解析(Parsing) 2. 查询重写(Query Rewrite) 3. 查询规划(Query Planning) 4. 查询执行(Query Execution) 5. 结果返回 示例:查询执…...

“先天项目经理圣体”丨超适合做项目经理的4种人

总有人在问,什么样的人适合做项目经理,当项目经理需要什么样的特质? 你别说,还真有那么一些人是“先天项目经理圣体”,天生就是吃项目经理这碗饭的。 沟通达人丨靠“嘴”走天下 我们知道项目经理大部分的时间都在进行…...

如何从object中抽取某几个值,然后转换成数组

可以使用Object.entries(), Array.prototype.filter()和Array.prototype.map()或者解构赋值的方式从对象中抽取某些值并转换为数组 示例 1:使用 Object.entries(), filter() 和 map() const obj {a: 1,b: 2,c: 3,d: 4 };const keysToExtract [a, c];const extr…...

数据结构(14)——哈希表(1)

欢迎来到博主的专栏:数据结构 博主ID:代码小豪 文章目录 哈希表的思想映射方法(哈希函数)除留余数法 哈希表insert闭散列负载因子扩容find和erase 哈希表的思想 在以往的线性表中,查找速度取决于线性表是否有序&#…...

K近邻算法_分类鸢尾花数据集

import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score1.数据预处理 iris load_iris() df pd.DataFrame(datairis.data, columnsiris.featur…...

nacos和eureka的区别详解

Nacos 和 Eureka 都是服务发现和注册中心的解决方案,但它们在功能、设计和使用场景上有所不同。以下是它们的详细区别: 1. 基本概念 Eureka:是由 Netflix 开发的服务发现工具。它主要用于 Java 微服务架构中的服务注册与发现。Eureka 通过 R…...

AI大模型包含哪些些技术?

Prompt Prompt提示是模型接收以生成响应或完成任务的初始文本输入。 我们给AI一组Prompt输入,用于指导模型生成响应以执行任务。这个输入可以是一个问题、一段描述、一组关键词,或任何其他形式的文本,用于引导模型产生特定内容的响应。 Tra…...

分布式技术概览

文章目录 分布式技术1. 分布式数据库(Distributed Databases)2. 分布式文件系统(Distributed File Systems)3. 分布式哈希表(Distributed Hash Tables, DHTs)4. 分布式缓存(Distributed Caching…...

动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:迟交互模型colbert微调实践 bge-m3 1. 环境准备 pip install transformers pip install open-retrievals注意安装时是pip install open-retrievals,但调用时只…...

Nacos rce-0day漏洞复现(nacos 2.3.2)

Nacos rce-0day漏洞复现(nacos 2.3.2) NACOS是 一个开源的服务发现、配置管理和服务治理平台,属于阿里巴巴的一款开源产品。影像版本:nacos2.3.2或2.4.0版本指纹:fofa:app“NACOS” 从 Github 官方介绍文档可以看出国…...

yjs04——matplotlib的使用(多个坐标图)

1.多个坐标图与一个图的折线对比 1.引入包;字体(同) import matplotlib.pyplot as plt import random plt.rcParams[font.family] [SimHei] plt.rcParams[axes.unicode_minus] False 2.创建幕布 2.1建立图层幕布 一个图:plt.fig…...

MOS管和三极管有什么区别?

MOS管是基于金属-氧化物-半导体结构的场效应晶体管,它的控制电压作用于氧化物层,通过调节栅极电势来控制源漏电流。MOS管是FET中的一种,现主要用增强型MOS管,分为PMOS和NMOS。 MOS管的三个极分别是G(栅极),D(漏极)&…...

医院多参数空气质量监控和压差监测系统简介@卓振思众

在现代医院管理中,确保患者和医疗人员的健康与安全是首要任务。为实现这一目标,医院需要依赖高科技设施来维持最佳的环境条件。特别是,多参数空气质量监测系统和压差监测系统在这一方面发挥了不可替代的作用。【卓振思众】多参数空气质量监测…...

[项目实战]EOS多节点部署

文章总览:YuanDaiMa2048博客文章总览 EOS多节点部署 (一)环境设计(二)节点配置(三)区块信息同步(四)启动节点并验证同步EOS单节点的环境如何配置 (一&#xf…...

setImmediate() vs setTimeout() 在 JavaScript 中的区别

setImmediate() vs setTimeout() 在 JavaScript 中的区别 在 JavaScript 中,setImmediate() 和 setTimeout() 都用于调度任务,但它们的工作方式不同。 JavaScript 的异步特性 JavaScript 以其非阻塞、异步行为而闻名,尤其是在 Node.js 环境…...

【Java文件操作】文件系统操作文件内容操作

文件系统操作 常见API 在Java中,File类是用于文件和目录路径名的抽象表示。以下是一些常见的方法: 构造方法: File(String pathname):根据给定的路径创建一个File对象。File(String parent, String child):根据父路径…...

关于若依flowable的安装

有个项目要使用工作流功能,在网上看了flowable的各种资料,最后选择用若依RuoYi-Vue-Flowable这个项目来迁移整合。 一、下载项目代码: 官方项目地址:https://gitee.com/shenzhanwang/Ruoyi-flowable/ 二、新建数据库&#xff…...

猜数字困难版(1-10000)

小游戏&#xff0c;通过提示每次猜高或猜低以及每次猜中的位数&#xff0c;10次内猜中1-10000的一个数。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…...

ASPICE术语表

术语来源描述活动Automotive SPICE V4.0由利益相关方或参与方执行的任务用参数Automotive SPICE V4.0应用参数是包含了在系统或软件层级可被更改的数据的软件变量&#xff0c;他们影响系统或软件的行为和属性。应用参数的概念有两种表达方式:规范(分别包括变量名称、值域范围、…...

NcmpGui:解锁网易云音乐NCM格式的终极桌面解决方案

NcmpGui&#xff1a;解锁网易云音乐NCM格式的终极桌面解决方案 【免费下载链接】ncmppGui 一个使用C编写的转换ncm文件的GUI工具 项目地址: https://gitcode.com/gh_mirrors/nc/ncmppGui 你是否曾因网易云音乐的NCM格式文件无法在其他播放器上正常播放而感到困扰&#x…...

Phi-4-reasoning-vision-15B行业应用:银行手机银行截图→交易流程合规性审计

Phi-4-reasoning-vision-15B在银行手机银行截图合规审计中的应用实践 1. 银行业务合规审计的痛点与机遇 在银行业务数字化转型的浪潮中&#xff0c;手机银行已成为客户办理业务的主要渠道。然而&#xff0c;随之而来的是海量的交易截图和操作记录需要人工审核&#xff0c;以确…...

猫抓资源嗅探扩展:5大核心功能彻底解析网络媒体捕获技术

猫抓资源嗅探扩展&#xff1a;5大核心功能彻底解析网络媒体捕获技术 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓&#xff08;Cat-Catch&#xff09;是一款开源免费的浏览器资源嗅探扩展&…...

效率飙升秘籍:用快马生成全自动opencode安装与配置工具

最近在折腾opencode的安装配置&#xff0c;发现手动操作实在太费时间了——要查文档、装依赖、配环境变量&#xff0c;一不小心就踩坑。后来发现用InsCode(快马)平台可以快速生成自动化脚本&#xff0c;效率直接翻倍。今天就把这个"偷懒"方案分享给大家。 环境预检查…...

保姆级教程:用300条数据微调SenseVoice语音模型(附数据格式详解)

300条数据高效微调SenseVoice语音模型的实战指南 去年在为一个医疗咨询项目定制语音识别系统时&#xff0c;我发现通用模型对专业医学术语的识别准确率不足60%。当时团队仅有400条标注数据&#xff0c;却通过SenseVoice的微调功能在3小时内将准确率提升至89%。本文将分享这种小…...

python中的枚举类

一些具有特殊含义的类&#xff0c;其实例化对象的个数往往是固定的&#xff0c;比如用一个类表示月份&#xff0c;则该类的实例对象最多有 12 个&#xff1b;再比如用一个类表示季节&#xff0c;则该类的实例化对象最多有 4 个。 针对这种特殊的类&#xff0c;Python 3.4 中新…...

一键部署体验:Nomic-Embed-Text-V2-MoE在星图GPU平台上的开箱即用Demo

一键部署体验&#xff1a;Nomic-Embed-Text-V2-MoE在星图GPU平台上的开箱即用Demo 你是不是也遇到过这种情况&#xff1f;看到一篇技术文章介绍某个很酷的开源模型&#xff0c;比如Nomic-Embed-Text-V2-MoE&#xff0c;心里痒痒的想立刻试试。结果一搜部署教程&#xff0c;又是…...

从零到一:OpCore-Simplify如何让黑苹果配置变得如此简单?

从零到一&#xff1a;OpCore-Simplify如何让黑苹果配置变得如此简单&#xff1f; 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCor…...

在macOS上利用PyInstaller为Windows生成exe文件的3种实用方法

1. 为什么macOS不能直接生成Windows的exe文件&#xff1f; 很多刚开始接触Python打包的开发者都会遇到一个头疼的问题&#xff1a;明明在macOS上写好的脚本&#xff0c;用PyInstaller打包后却不能在Windows电脑上运行。这其实和PyInstaller的工作原理有关——它需要访问目标平…...

如何将Serge与LangChain集成:打造企业级AI应用的终极指南

如何将Serge与LangChain集成&#xff1a;打造企业级AI应用的终极指南 【免费下载链接】serge A web interface for chatting with Alpaca through llama.cpp. Fully dockerized, with an easy to use API. 项目地址: https://gitcode.com/gh_mirrors/se/serge Serge是一…...