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

Volatile的相关内容

首先补充几个知识点:

内存可见性

举一个例子:

终端:

分析:t2线程没问题,问题在于t1。1!=0,t1应该结束才对。

·t2改了flag,t1没有看见。   t2是写入,t1是读取

·flag变量的修改对于t1线程不可见

编译器优化

·大多数情况是可以做到逻辑不变并对代码优化调整,提高效率,但一些特定场景可能会出现误判

比如这个过程:load(拿数据--读内存),cmp(比较--寄存器操作),load,cmp 反复执行,在反复执行中拿到flag一样;但是load比cmp耗时多---读内存比读寄存器效率慢得多。此时load读到的值一样,编译器直接把从内存读取flag这个操作优化掉了。

·编译器不是看不见改变,而是不知道另外一个线程的他flag修改代码能不能执行以及啥时候执行。

        --用户输入啥,编译器无法预计。

volatile解决内存可见性引起的线程安全问题

关键字修饰变量:

·提醒JVM在读写volatile变量指令前后添加“内存屏障相关的指令“

结合java内存模型 --- JMM

·一个java进程会有一个“主内存”存储空间

·每个java线程又有自己的“工作内存”存储空间---其实不是内存,是存储介质

       -再深层一点,在操作系统分析,“工作内存”中不仅有寄存器,还有缓存,(缓存有很多层)

·上方的代码例子,t1进行flag变量的判定,先把flag值从主内存读到工作内存,用工作内存中的值进行判定。同时t2对flag进行修改,修改的是主内存的值,主内存的变更不会影响到t1的工作内存

http://www.xdnf.cn/news/643825.html

相关文章:

  • Lombok与Jackson实现高效JSON序列化与反序列化
  • Python类与对象:面向对象编程的基础
  • Kubernetes 核心原理详解
  • Python实现基于线性回归的空气质量预测系统并达到目标指标
  • 内存管理 : 02 内存分区与分页
  • Python实例题:Python打造漏洞扫描器
  • 【AI论文】KRIS-基准测试:评估下一代智能图像编辑模型的基准
  • LangChain4j HelloWorld
  • 分词算法BPE详解和CLIP的应用
  • 测试计划与用例撰写指南
  • SAP Commerce(Hybris)开发实战(二):登陆生成token问题
  • 企业级智能体 —— 企业 AI 发展的下一个风口?
  • 【公式】批量添加MathType公式编号
  • [Linux]磁盘分区及swap交换空间
  • 第38节:PyTorch模型训练流程详解
  • Baklib知识中台构建实战
  • [DS]使用 Python 库中自带的数据集来实现上述 50 个数据分析和数据可视化程序的示例代码
  • 【LangChain全栈开发指南】从LLM应用到企业级AI助手构建
  • LLM多平台统一调用系统-LiteLLM概述
  • MYSQL备份恢复知识:第五章:备份原理
  • 渗透测试流程-下篇
  • 定时任务调度平台XXL-JOB
  • 基于Python实现JSON点云数据的3D可视化与过滤
  • 美团2025年校招笔试真题手撕教程(三)
  • Spring 源码阅读(循环依赖、Bean 生命周期、AOP、IOC) - 5.2.15.RELEASE
  • 电路笔记(通信):RS-485总线 物理层规范 接口及其组成部分 瑞萨电子RS-485总线笔记
  • vue3中computed计算属性和watch监听的异同点
  • Qt实战教程:设计并实现一个结构清晰、功能完整的桌面应用
  • 机械师安装ubantu双系统:一、制作系统盘
  • React从基础入门到高级实战:React 核心技术 - 组件通信与 Props 深入