栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

解剖Java关键字之Volatile原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

解剖Java关键字之Volatile原理

Volatile

如果主内存 count 变量发生修改之后,线程工作内存中的值由于己经加载,不会产生对应的
变化,所以计算出来的结果会和预期不一样,对于 volatile 修饰的变量,jvm 虚拟机只是保证从主内存加载到线程工作内存的值是最新的

Volatile 是如何来保证可见性?
内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态

lock 前缀的指令在多核处理器下会引发了两件事情:

    将当前处理器缓存行的数据会写回到系统内存这个写回内存的操作会引起在其他 CPU 里级存了该内存地址的数排无效。
(1)Java变量的读写

Java通过几种原子操作完成工作内存和主内存的交互:

    lock:作用于主内存,把变量标识为线程独占状态。unlock:作用于主内存,解除独占状态。read:作用主内存,把一个变量的值从主内存传输到线程的工作内存。load:作用于工作内存,把read操作传过来的变量值放入工作内存的变量副本中。use:作用工作内存,把工作内存当中的一个变量值传给执行引擎。assign:作用工作内存,把一个从执行引擎接收到的值赋值给工作内存的变量。store:作用于工作内存的变量,把工作内存的一个变量的值传送到主内存中。write:作用于主内存的变量,把store操作传来的变量的值放入主内存的变量中。
(2)volatile的特殊规则

read、load、use动作必须连续出现。ssign、store、write动作必须连续出现每次读取前必须先从主内存刷新最新的值每次写入后必须立即同步回主内存当中 (3)执行流程

如果对声明了 volatile 变量进行写操作,JVM 就会向处理器发送一条Lock 前缀的指令,将这个变量所在缓存行的数据写回到系统内存为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检杳自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。 (4)Volatile 的内存屏障

防止指令重排

为了实现 volatile 的语义,JMM 在编译器和处理器层面限制指令重排序。
JMM 的内存屏障插入策略是保守策略:

    在每个volatile写操作的前面插入一个StoreStore屏障。在每个volatile写操作的后面插入一个StoreLoad屏障。在每个volatile读操作的后面插入一个LoadLoad屏障。在每个volatile读操作的后面插入一个LoadStore屏障。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号