volatile是如何禁止指令进行重排序的

简介: volatile是如何禁止指令进行重排序的

Further Reading : 内存屏障类型介绍(StoreStore,StoreLoad,LoadLoad,LoadStore)
Further Reading : 什么是指令重排

重排序分为编译器重排序和处理器重排序。 为了实现volatile内存语义,JMM会分别限制这两种类型的重排序类型。

● volatile禁止的重排序
1、当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。
2、当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。
3、当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。

●JMM针对编译器制定的volatile重排序规则表
在这里插入图片描述

● volatile如何禁止重排序的?
编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。
第1步:在每个volatile写操作的前面插入一个StoreStore屏障,后面插入一个StoreLoad屏障。
在这里插入图片描述

●StoreStore屏障 禁止上面普通写与下面volatile写重排序,上面普通读与下面volatile写如何禁止重排序?
虽然StoreStore屏障主要作用于防止store-store重排序,但在volatile写操作中实际会使用更复杂的内存屏障组合,以确保volatile写之前的普通读不会被重排到volatile写之后。

第2步:在每个volatile写操作的后面插入一个StoreLoad屏障
StoreLoad屏障 禁止 volatile写和volatile读重排序

因为编译器常常无法准确判断在一个volatile写的后面是否需要插入一个StoreLoad屏障(比如,一个volatile写之后方法立即return)。为了保证能正确实现volatile的内存语义,JMM在采取了保守策略:在每个volatile写的后面,或者在每个volatile读的前面插入一个StoreLoad屏障。从整体执行效率的角度考虑,JMM最终选择了在每个volatile写的后面插入一个StoreLoad屏障。因为volatile写-读内存语义的常见使用模式是:一个写线程写volatile变量,多个读线程读同一个volatile变量。当读线程的数量大大超过写线程时,选择在volatile写之后插入StoreLoad屏障将带来可观的执行效率的提升。从这里可以看到JMM在实现上的一个特点:首先确保正确性,然后再去追求执行效率。

第3步:在每个volatile读操作的后面插入一个LoadLoad屏障,一个LoadStore屏障。

在这里插入图片描述

LoadLoad屏障+LoadStore屏障 禁止 普通读,普通写 和volatile读重排序

相关文章
|
存储 算法 NoSQL
还分不清 Cookie、Session、Token、JWT?看这一篇就够了
Cookie、Session、Token 和 JWT(JSON Web Token)都是用于在网络应用中进行身份验证和状态管理的机制。虽然它们有一些相似之处,但在实际应用中有着不同的作用和特点,接下来就让我们一起看看吧,本文转载至http://juejin.im/post/5e055d9ef265da33997a42cc
49450 13
|
缓存 Java 编译器
关于volatile与指令重排序的探讨
关于volatile与指令重排序的探讨
298 1
|
消息中间件 中间件 Kafka
分布式事务最全详解 ,看这篇就够了!
本文详解分布式事务的一致性及实战解决方案,包括CAP理论、BASE理论及2PC、TCC、消息队列等常见方案,助你深入理解分布式系统的核心技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式事务最全详解 ,看这篇就够了!
|
消息中间件 存储 缓存
QPS多少,才算高并发 ?
本文详解高并发概念及 QPS 标准,大厂面试高频点,建议掌握收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
QPS多少,才算高并发 ?
|
存储 缓存 安全
ConcurrentHashMap的实现原理,非常详细,一文吃透!
本文详细解析了ConcurrentHashMap的实现原理,深入探讨了分段锁、CAS操作和红黑树等关键技术,帮助全面理解ConcurrentHashMap的并发机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
ConcurrentHashMap的实现原理,非常详细,一文吃透!
|
Rust JavaScript 前端开发
【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
3114 0
|
JSON 前端开发 中间件
三万字长文让你彻底掌握 FastAPI
三万字长文让你彻底掌握 FastAPI
3746 2
|
存储 机器学习/深度学习 人工智能
深入浅出 AI 智能体(AI Agent)|技术干货
随着人工智能技术的发展,智能体(AI Agents)逐渐成为人与大模型交互的主要方式。智能体能执行任务、解决问题,并提供个性化服务。其关键组成部分包括规划、记忆和工具使用,使交互更加高效、自然。智能体的应用涵盖专业领域问答、资讯整理、角色扮演等场景,极大地提升了用户体验与工作效率。借助智能体开发平台,用户可以轻松打造定制化AI应用,推动AI技术在各领域的广泛应用与深度融合。
33308 1