核心作用:解决可见性和有序性问题

volatile 的主要作用可以归结为两点:

                1.保证变量的可见性 和 禁止指令重排序

                2.它提供了一种轻量级的同步机制,

                3.但需要注意的是,它不能保证原子性

保证可见性:

  • 什么是可见性问题?

        1.在 Java 内存模型中,每个线程都有自己的工作内存。

        2.线程操作变量时,通常会先从主内存拷贝一份到自己的工作内存,

           操作完成后再刷回主内存。

问题在于:一个线程修改了自己工作内存中的变量副本,在没有同步机制的情况下,其他线程可能无法立即看到这个修改,读到的仍然是旧值。

  • volatile 如何解决?

                写操作:当写一个 volatile 变量时,

                              JVM 会立即将该线程工作内存中的新值强制刷新到主内存中。

                读操作:当读一个 volatile 变量时,

                              JVM 会使该线程工作内存中的缓存失效,

                              从而强制它从主内存中重新读取最新的值。

这样就保证了,一旦某个线程修改了 volatile 变量,这个新值对其他所有线程来说都是立即可见的。它解决了线程间的可见性问题。

禁止指令重排序 

  • 什么是指令重排序问题?

                1.为了优化性能,编译器和处理器常常会对指令的执行顺序进行重排序(在不改变单线

                   程程序语义的前提下)。

                2.在单线程下没问题,但在多线程环境下,这种乱序执行可能导致意想不到的错误。

  • volatile 如何解决?

                过添加内存屏障(Memory Barrier)来实现。   

                在写 volatile 变量时,会在写操作后插入一个“写屏障”,

                确保该变量之前的所有操作都已经完成,并且结果对其他线程可见。

                这些屏障阻止了编译器和水线将 volatile 变量的操作与其他内存操作进行重排序,

                从而保证了有序性。

     不能保证原子性 

    这是一个非常关键的限制,也是 volatile 最常见的误用点

    • 什么是原子性?

            原子性意味着一个操作是不可中断的,

            要么完全执行成功,要么完全不执行。

            例如 i++ 这个操作,它实际上包含三个步骤:

                    读取 i 的值

                    将 i 的值加 1

                    将新值写回 i
    这是一个复合操作,而不是原子操作。

    • 为什么 volatile 不行?

    假设两个线程同时执行 volatileInt++volatileInt 是 volatile 变量):

    1. 线程 A 读取 volatileInt 的值为 10。

    2. 线程 B 读取 volatileInt 的值为 10(因为线程 A 还没写回,可见性保证了读到的都是最新值,但读取后它们就各自操作了)。

    3. 线程 A 对 10 加 1 得到 11,并立即写回主内存(由于是 volatile,写成功)。

    4. 线程 B 也对 10 加 1 得到 11,并写回主内存(覆盖了线程 A 的结果)。
      最终结果不是预期的 12,而是 11。

    可见性保证了它们读到的都是最新的,但无法阻止它们在“读取-修改-写回”这个过程中被中断。要解决这个问题,必须使用锁(synchronized)或原子类(如 AtomicInteger)。

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

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

      相关文章

      【Linux】MySQL数据目录迁移步骤(含流程图踩坑经验)

      在生产环境中,有时候你会遇到一些看似简单但实际上很棘手的问题。最近我就碰到了一次典型的服务器磁盘空间告急,最后通过迁移 MySQL 数据目录成功解决了问题。本文记录整个过程,包括我的分析思路、迁移步骤、踩坑和经验总结,希望对…

      数据驱动下的连锁模式复制:技术科普与方法论深度解析

      前言在连锁经营的赛道上,“复制”是核心命题,但绝非简单的“粘贴”。当行业进入数字化深水区,数据驱动正成为连锁模式突破增长瓶颈、实现高效复制的“隐形引擎”。本文将从技术科普与方法论心得两个维度,深度拆解数据如何重塑连锁…

      数据库学习MySQL系列2、Windows11系统安装MySQL方法一.msi安装详细教程

      方法一.msi安装详细教程 Windows系统下MySQL——.msi安装详细教程(默认--只安装服务端“Server only”)MySql官网地址:https://www.mysql.com/;快速下载通道请单击→ No thanks, just start my download.ps:其他资源(…

      html+css+vue实现增删改查

      代码如下&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>优化版 Vue.js CRUD 示例&l…

      (计算机网络)DNS解析流程及两种途径

      在计算机网络中&#xff0c;DNS&#xff08;Domain Name System&#xff09;用于 将域名解析为 IP 地址。一个完整的解析过程涉及 递归查询、迭代查询&#xff0c;以及多个关键角色&#xff08;LDNS、本地域名服务器&#xff1b;根服务器&#xff1b;顶级域名服务器&#xff1b…

      数据结构——队列(Java)

      一.基本概念 队列用来存储逻辑关系为“一对一”的数据&#xff0c;是一种“特殊”的线性存储结构。 特点&#xff1a; •先进先出&#xff1a;队列中元素的添加&#xff08;入队enqueue&#xff09;和移除&#xff08;出队dequeue&#xff09;遵循先进先出的原 则。 •端点&…

      【Go】:mac 环境下GoFrame安装开发工具 gf-cli——gf_darwin_arm64

      当前主要是关于gf_darwin_arm64的安装步骤 如何快速给mac电脑安装gfgf是什么安装步骤方法1&#xff1a;去github下载gf-cli去git上下载对应电脑版本的gf-cli验证下载文件是否二进制文件授予该文件权限方法2&#xff1a;去goframe官网教你下载步骤验证gf是否安装成功可能遇到的问…

      【新】ApiHug官方文档-ApiHug Spring Security 扩展-补充说明

      概述 在上次说明中我们写了ApiHug 如何做授权的&#xff0c; 这里有个概念的混淆&#xff0c; 其实 apihug 不是在spring security 上做的安全扩展&#xff0c; 应该是 apihug spring, 安全设计框架&#xff0c; 和本身 spring security 没有半毛钱关系&#xff0c; 而如果你…

      【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇

      概述&#xff1a;本篇是接着上一篇&#xff0c;细分出说明书的编写部分&#xff0c;实现这个功能的需求&#xff0c;是内部很多同事反馈&#xff0c;需要有个地方存工具&#xff0c;并且可以写说明书&#xff0c;如果需要的人&#xff0c;那么可以在界面上直接下载工具和查看工…

      Mac设置中的安全性缺少“任何来源”

      问题&#xff1a;用Mac安装软件&#xff0c;隐私性与安全性&#xff0c;想切换“任何来源”用来下载网站的app&#xff0c;但是菜单栏找不到“任何来源”选项&#xff0c;无法安装dmg的文件终端中一行代码设置出来&#xff1a;sudo spctl --global-disable &#xff08;禁用Mac…

      uniapp开发小程序,列表 点击后加载更多数据

      一、需求 1.初始显示限制:将每页条数limit改为5,确保初始只显示5条数据 2.查看更多功能:添加了loadMore方法,点击"查看更多"时加载下一页数据 3.实现查看更多功能,点击后加载更多数据 4.添加loading状态防止重复请求 添加hasMore状态判断是否还有更多数据 …

      Windows 部署 Gerrit 与 Apache24 配置

      Windows 部署 Gerrit 与 Apache24 并配置反向代理 准备工作 下载并安装 Java JDK 确保配置 JAVA_HOME 环境变量博主这里安装openjdk21 https://jdk.java.net/archive/下载所需软件 Apache24&#xff1a;https://httpd.apache.org/download.cgi Gerrit&#xff1a;https://www.g…

      从 Excel 趋势线到机器学习:拆解 AI 背后的核心框架​

      引言&#xff1a;你其实早就 “玩转” 过机器学习&#xff1f;提到 “机器学习”&#xff0c;你是不是第一时间联想到复杂的代码、密密麻麻的公式&#xff0c;还有那些让人头晕的 “算法”“模型”“训练” 术语&#xff1f;仿佛它是高高在上的技术&#xff0c;离我们的日常无比…

      Lenovo联想YOGA Pro 16 IAH10 2025款笔记本电脑(83L0)开箱状态预装OEM原厂Win11系统

      适用机型(MTM)&#xff1a;【83L0】 链接&#xff1a;https://pan.baidu.com/s/1tDpeBb93t1u0XIgqAZ3edg?pwdqy2r 提取码&#xff1a;qy2r 联想原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想浏览器、电脑管家、…

      Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)

      一、DrawBoard 1、Dependencies 模块级 build.gradle implementation com.github.jenly1314:drawboard:1.1.02、Test &#xff08;1&#xff09;Activity Layout activity_draw_board.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout …

      捷多邦揭秘超厚铜板:从制造工艺到设计关键环节​

      一、超厚铜板制造工艺要点超厚铜板&#xff08;3oz 及以上&#xff09;的制造工艺对精度和稳定性要求严苛&#xff0c;核心环节需突破多重技术壁垒。蚀刻工艺中&#xff0c;因铜箔厚度达 105μm 以上&#xff0c;需采用高浓度酸性蚀刻液&#xff08;氯化铜浓度控制在 180-220g/…

      【MYSQL | 高级篇 MyCat实现分库分表】

      摘要&#xff1a;本文围绕分库分表展开&#xff0c;先分析单库性能瓶颈&#xff0c;介绍垂直与水平拆分策略及实现技术&#xff0c;再详述 MyCat 中间件的概述、环境准备、目录结构&#xff0c;讲解其入门配置与测试&#xff0c;深入说明核心配置文件&#xff0c;最后演示垂直和…

      Docker部署Drawnix开源白板工具

      Drawnix简介 Drawnix 是一款开源的在线白板工具&#xff08;SaaS&#xff09;&#xff0c;集思维导图、流程图绘制、自由画图等多种功能于一体&#xff0c;支持协作与插件扩展&#xff0c;适用于个人创作、团队协作和远程办公场景。它完全免费且开源&#xff0c;提供丰富的编辑…

      Griffin|增强现实数据集|无人机数据集

      Griffin|增强现实数据集|无人机数据集 数据来源&#xff1a;huggingface 百度网盘 构建方式 Griffin数据集的构建采用了模块化架构&#xff0c;结合了CARLA和AirSim平台&#xff0c;通过模拟真实世界中的无人驾驶环境和无人机动态&#xff0c;收集了超过30,000帧图像数据&am…

      力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)

      目录 力扣.1054距离相等的条形码 力扣767.重构字符串 力扣47.全排列II 力扣980.不同路径III 力扣509.斐波那契数列&#xff08;记忆化搜索) 力扣.1054距离相等的条形码 是否策略正确 但是假如 1 2 2 此时 1_2 此时中间只能填写2&#xff0c;但是就不对了&#xff0c;所…