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

volatile解决了什么问题,底层原理是什么

一、解决了什么问题

volatile 是多线程环境下的一个轻量级的同步机制,它主要解决了两个问题:内存可见性 和禁止指令重排序。它不能保证原子性。

内存可见性:
各线程从主内存读取变量到自己的工作内存,线程在自己的工作内存中更新变量,在未来的某个时间点,将修改更新到主内存中。
该过程中,若无 volatile修饰,则其它线程无法立即看到当前线程的修改。volatile修饰后,当前线程修改后强制、立即刷到主内存,且基于Happens-Before原则,volatile修饰的变量的读操作必须在写操作之后,所以其它线程可以立即看到当前线程的修改。

指令重排:
为了优化性能,编译器和处理器可能会在不改变单线程程序语义的前提下,重新排序指令的执行顺序。但在多线程环境下,这种重排序可能导致意想不到的结果
使用 volatile 修饰变量可以禁止 JVM 和处理器对相关的指令进行重排序,保证顺序上的正确性。

二、实现原理

volatile的语义是通过编译后生成的内存屏障来实现的,内存屏障本质是一类CPU指令。
JMM为volatile变量的读写提供了不同类型的内存屏障:

  1. 在每个volatile写操作之前,插入一个 StoreStore内存屏障。作用是,确保在该屏障前的所有普通写操作都刷新到主内存之后,才执行volatile写操作,这样保证了volatile修改时的内容在各线程间是一致的
  2. 在每个volatile写操作之后,插入一个StoreLoad内存屏障。作用是,确保 volatile 写操作的结果立即对其他线程可见(刷新到主内存),并且会禁止与后续的 volatile 读/写操作重排序。注意,该内存屏障的开销相比其它屏障来说,开销更大
  3. 在每个volatile读操作之后,插入LoadLoadLoadStore内存屏障。作用是,确保在执行后续的指令之前,必须先重新从主内存加载 volatile 变量的最新值。并且禁止与前面的 volatile 读操作重排序
三、和synchronized的区别
volatilesynchronized
本质JVM轻量级的关键字JVM重量级的关键字
原子性不保证原子性保证原子性
可见性保证可见性保证可见性
有序性通过禁止指令重排保证有序性通过同一时刻只有一个线程运行保证有序性
阻塞不会造成线程阻塞会造成线程阻塞
适用场景状态标志等复杂的复合操作,需要原子性的场景
http://www.dtcms.com/a/443173.html

相关文章:

  • 太原市手机网站建设服务平台app下载
  • 东莞做网站排名网站建设的风险
  • 汕头网站时优化宿迁集团网站建设
  • 网站开发的就业前景如何小白学做搭建网站
  • 知识图谱(Knowledge Graph)详解
  • 专门做外链的网站手机怎么免费建网站
  • 【Unity】HybridCLR:原生C#热更新革命
  • TomcatHttp协议
  • JavaScript 数组元素移动至特定索引位置
  • 怎么学做淘宝电商网站沈阳网站建设方案服务
  • 沧州海外网站建设广告联盟怎么做
  • 专业模板建站服务网站维护有多长时间
  • 红黑树动画演示
  • 当“技能拼装”遇上“多智能体协奏”——Microsoft Agent Framework 与 Semantic Kernel 全维度深度拆解与实战指南
  • 那些网站可以做淘宝店铺推广wordpress 平台
  • 云原神官方网站正版下载郑州网站优化的微博_腾讯微博
  • 做蛋糕招聘网站wordpress七牛云使用
  • 网站开发项目技能比赛获奖报道h5创建网站
  • 深圳网站维护制作电子商务网站创建方案
  • 摄影师网站html5房地产招新人的坑
  • Effective Python 第38条:简单的接口应该接受函数,而不是类的实例
  • 彩票理财网站建设做毛绒玩具在什么网站上找客户
  • Python f-string 用法详解
  • 广州做网站哪间公司好广东网站建设公司电话
  • 怎样在工商网站做遗失wordpress批量修改文章内链接
  • 百度网站v2升级到v3怎么做培训学校招生方案
  • 网站流量转化seo的宗旨是
  • [YMOJ]现代化开源OJ(在线编程)平台技术分享
  • 长沙自适应网站制作wordpress 页面 插件
  • 徐州的网站设计公司企业管理