Java内存模式以及volatile关键字的使用
1.Java内存模型
(1)Java 内存模型(Java Memory Model,简称 JMM),它是一个抽象的概念,JMM是和多线程相关的,它是一组规范,描述了一组规则,定义了多线程对共享变量读写操作时的行为规范,通过这些规则来规范对内存的读写操作,从而保证多线程对共享数据操作的原子性、可见性以及有序性。
(2)同时通过这套规范,屏蔽掉底层不同操作系统、不同 CPU 硬件之间的差异,让 Java 程序员按照统一的方式来编程,保证 Java 程序在各种平台下对内存的访问都能够得到相同的效果
(3)具体如下:
①所有的变量都存储在主内存中,每个线程都可以访问;
②每条线程都有自己私有的工作内存;
③线程的工作内存中保存了该线程中用到的主内存变量的副本拷贝;
④线程对变量的所有操作都必须在工作内存中进行,而不能直接操作主内存;
⑤不同线程之间也无法直接访问对方工作内存中的变量
2.volatile
(1)volatile关键字只能修饰类变量和实例变量,对于方法参数、局部变量以及实例常量、类常量都不能进行修饰;
(2)volatile 的主要作用是使共享变量在多线程间可见,如果一个字段被声明成 volatile,Java 线程内存模型会确保所有线程看到这个变量的值都是一致的
(3)volatile 可以保证可见性,不能保证原子性,volatile 也可以保证有序性
2.1 volatile 的使用场景
(1)在一些对变量的操作已经是原子性的情况下,可以使用 volatile 关键字;
(2)运行结果并不依赖变量的当前值,可以使用 volatile 关键字,volatile 不适合复合操
作,像 i++这种类型操作不适合使用 volatile; int a=10; a = 20;
(3)一些状态标志的场景,比如仅仅是使用一个布尔状态 true 和 false 标志;
(4)定期更新,供程序内部使用的变量,可以使用 volatile;
(5)双重检查锁定(double-checked-locking)问题可以用 volatile;
注:如果对共享变量已经加锁,加锁本身已经保证了可见性、原子性、有序性,此时就没必要再使用 volatitle
相关文章:
Java内存模式以及volatile关键字的使用
1.Java内存模型 (1)Java 内存模型(Java Memory Model,简称 JMM),它是一个抽象的概念,JMM是和多线程相关的,它是一组规范,描述了一组规则,定义了多线程对共享…...
每日5题Day3 - LeetCode 11 - 15
每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:11. 盛最多水的容器 - 力扣(LeetCode) class Solution {public int maxArea(int[] height) {//这道题比较特殊,因为两边是任意…...
路由器、交换机和网卡
大家使用VMware安装镜像之后,是不是都会考虑虚拟机的镜像系统怎么连上网的,它的连接方式是什么,它ip是什么? 路由器、交换机和网卡 1.路由器 一般有几个功能,第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…...
腾讯开源混元DiT文生图模型,消费级单卡可推理
节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…...
shell脚本基础(if/else结构)
命令是双向选择语句,当用户执行脚本时如果不满足if后的表达式也会执行else后的命令,所以有很好的交互性。其结构为: if expression1 then command … command else command … command fi vim ifelse_exam.sh #ifelse_exam.sh #!/bin/bashec…...
万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)
想象一下:你闭上眼睛,脑海中构思一个场景,用简短的语言描述出来,然后“啪”的一声,一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节,而是Stable Diffusion——一种前沿的AI图片生成算法—…...
Linux---编辑器vim的认识与简单配置
前言 我们在自己的电脑上所用的编译软件,就拿vs2022来说,我们可以在上面写C/C语言、python、甚至java也可以在上面进行编译,这种既可以用来编辑、运行编译,又可以支持很多种语言的编译器是一种集成式开发环境,集众多于…...
lucene中Collector类、CollectorManager类区分和用法
我的lucene版本是9.10.0,请说明Collector类、CollectorManager类区分和用法,尽量详细点 在 Lucene 9.10.0 中,Collector 类和 CollectorManager 类都是用于搜索结果的收集和处理 Collector 类 Collector 类是一个接口,用于收集…...
Android之给Button上添加按压效果
一、配置stateListAnimator参数实现按压效果 1、按钮控件 <Buttonandroid:id"id/mBtnLogin"android:layout_width"match_parent"android:layout_height"48dp"android:background"drawable/shape_jfrb_login_button"android:state…...
python EEL + vue3.js 项目中如何把组件中的函数提升为全局函数
eel官方示例中暴露的js函数是全局函数,vue中的自定义函数作用域通常都是组件范围内。要让eel.js调用,需要将其升为全局可用。 一般方法有 app.config.globalProperties 或 mixin等。 main.js //main.jsimport { createApp } from vue import App from…...
sqli-labs靶场第十四关
目录 1:分析 找闭合符: 2:开始注入 报错注入: 注入数据库名: 注入表名: 注入列名: 注入具体值: 1:分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…...
【C语言】6.C语言VS实用调试技巧(1)
文章目录 1.什么是 bug2.什么是调试(debug)?3.Debug 和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5.监视和内存观察5.1 监视5.2 内存 1.什么是 bug bug现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题…...
AIGC行业现在适合进入吗
人工智能、物联网、基因编辑和量子计算等新兴技术领域正在以前所未有的速度发展,这些技术的结合正在重塑我们的世界。在这个充满机遇和挑战的时代,AIGC(人工智能、基因编辑和量子计算)行业备受关注,许多人都在考虑是否…...
ubuntu CUDA 驱动更新,版本更新,多CUDA版本管理
1 新版本驱动下载 前面介绍过window CUDA驱动更新,但是对于ubuntu 的驱动更新,没有一键操作。 本人笔记本电脑n年前装的CUDA DRIVER仅支持到cuda10.2,实在无法满足这日新月异的科技更新。 左 旧的驱动版本 右 新下载的硬件支持的驱动版本&…...
effective python学习笔记_类与接口
用组合类实现多层结构而不用内置类型 例子:成绩单,存储学生各科成绩多个然后加权重,如果用字典类型会导致字典有多层嵌套结构 思想 当用内置类型如字典元组等结构出现超过二层的多层嵌套结构时,读起来会比较难懂,此时…...
如何去除字符串两侧的空白字符?
TRIM函数会去掉字符串左侧和右侧的空格,语法是:TRIM(字符串) excel中,TRIM函数能去掉字符串左侧和右侧的空格,它的ASCII码是32。 以下设定一个字符串组合,它的第一个字符中空格,最后一个字符是换行符 &q…...
Flutter 中的 PageStorage 小部件:全面指南
Flutter 中的 PageStorage 小部件:全面指南 在Flutter中,PageStorage小部件提供了一种方法来保存和恢复页面间的信息,这对于具有多个页面且需要在这些页面之间共享状态的应用程序非常有用。本文将详细介绍PageStorage的用途、如何使用它以及…...
头歌实践教学平台:CG1-v2.0-直线绘制
第1关:直线光栅化-DDA画线算法 一.任务描述 1.本关任务 (1)根据直线DDA算法补全line函数,其中直线斜率0<k<1; (2)当直线方程恰好经过P(x,y)和T(x,y1)的中点M时,统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两…...
Nacos+GateWay 搭建微服务架构
文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口(开发环境…...
【2024华为HCIP831 | 高级网络工程师之路】刷题日记(18)
个人名片:🪪 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:&a…...
Qwen3.5-9B-AWQ-4bit开源可部署教程:私有云/K8s集群中部署多实例视觉理解服务
Qwen3.5-9B-AWQ-4bit开源可部署教程:私有云/K8s集群中部署多实例视觉理解服务 1. 模型概述 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词,输出中文分析结果。这个量化版本特别适合在资源受限的环境中部…...
抖音批量下载终极指南:3分钟掌握高效无水印下载技巧
抖音批量下载终极指南:3分钟掌握高效无水印下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...
如何通过手机号快速查询QQ号:3分钟解决账号遗忘难题
如何通过手机号快速查询QQ号:3分钟解决账号遗忘难题 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 在数字时代,QQ账号作为重要的社交和工作工具,其安全性与可访问性至关重要。然而,更…...
Qwen3-VL-WEBUI部署避坑指南:从Docker到网页访问全流程
Qwen3-VL-WEBUI部署避坑指南:从Docker到网页访问全流程 1. 部署前的准备工作 1.1 硬件与系统要求 在开始部署Qwen3-VL-WEBUI之前,请确保您的设备满足以下最低配置要求: GPU:NVIDIA RTX 4090D(24GB显存)…...
东华OJ-基础题-48-数列1(C++)
问题描述 思维的严密性是相当重要的,尤其是在程序设计中,一个小小的错误,就可能导致无法想象的后果。明明的爸爸是一名富有经验的程序设计专家,深知思维严密的重要性。于是在明明很小的时候,就通过游戏的方式训练明明的…...
视频硬字幕提取终极指南:用本地AI工具10倍提升你的字幕制作效率
视频硬字幕提取终极指南:用本地AI工具10倍提升你的字幕制作效率 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测…...
gh_mirrors/eg/eggs深度解析:一站式解决所有服务器部署难题
gh_mirrors/eg/eggs深度解析:一站式解决所有服务器部署难题 【免费下载链接】eggs Service eggs for the pterodactyl panel 项目地址: https://gitcode.com/gh_mirrors/eg/eggs 在服务器管理领域,快速部署和高效运维一直是开发者和管理员面临的核…...
App启动总览
特征 / 步骤 冷启动 (Cold Start) 温启动 (Warm Start) 热启动 (Hot Start) 速度 最慢 🐢 中等 🏃 最快 🚀 进程创建 ✅ 需要 ❌ 跳过 ❌ 跳过 Application.onCreate() ✅ 需要调用 ❌ 跳过 ❌ 跳过 Activity.onCreate() ✅ 需要调用 ✅ 需要调用 ❌ 跳过 Activity.onSta…...
Splitting.js创意指南:让网页文字动起来的实用技巧
Splitting.js创意指南:让网页文字动起来的实用技巧 【免费下载链接】Splitting JavaScript microlibrary to split an element by words, characters, children and more, populated with CSS variables! 项目地址: https://gitcode.com/gh_mirrors/sp/Splitting …...
嵌入式系统模块化设计:内聚与耦合实战指南
1. 嵌入式模块设计的核心原则在嵌入式系统开发中,模块化设计质量直接影响着整个系统的生命周期成本。我经历过多个嵌入式项目后发现,那些后期维护成本高昂的系统,往往都存在模块边界模糊、依赖混乱的问题。模块化不是简单的代码分割ÿ…...
