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

多线程(54)JMM中的内存屏障

Java内存模型(JMM)中的内存屏障是一种保证内存可见性、顺序性的底层机制。它们是一组指令,用于在多线程环境中确保内存操作的有序性和可见性。内存屏障主要分为四类:LoadLoad、StoreStore、LoadStore和StoreLoad。

内存屏障的类型

  1. LoadLoad屏障:确保LoadLoad屏障前的读操作不会被重排序到屏障后的读操作之后。
  2. StoreStore屏障:确保StoreStore屏障前的写操作不会被重排序到屏障后的写操作之后。
  3. LoadStore屏障:确保LoadStore屏障前的读操作不会被重排序到屏障后的写操作之后。
  4. StoreLoad屏障:确保StoreLoad屏障前的写操作不会被重排序到屏障后的读操作之后。这是最强的一种屏障,因为它同时阻止了前方的写和读操作被重排序到屏障之后。

内存屏障在Java中的应用

在Java中,volatile变量的读写,synchronized的锁的获取与释放,以及final字段的写操作,都会涉及到内存屏障的使用,来保证操作的有序性和可见性。

volatile变量
  • 写volatile变量:在写volatile变量之后,会插入一个StoreStore屏障,保证写操作之前的所有普通写(非volatile写)都完成;还会插入一个StoreLoad屏障,确保之后所有的读写操作都能看到这个volatile写。

  • 读volatile变量:在读volatile变量之前,会插入一个LoadLoad屏障,以及一个LoadStore屏障,确保volatile读操作之前的所有读操作都完成。

synchronized
  • 进入synchronized块:会插入一个LoadLoad屏障和一个LoadStore屏障,确保后续的读操作可以看到之前已经发生的写操作。

  • 退出synchronized块:会插入一个StoreStore屏障和一个StoreLoad屏障,保证锁释放之前的所有操作(包括所有的读写操作)都完成。

代码演示

Java代码本身并不直接操作内存屏障,但可以通过Unsafe类来模拟内存屏障的效果。以下是一个简化的示例,不是直接在Java代码中使用的实际模式,因为JMM的内存屏障是自动管理的。

class MemoryBarrierExample {private volatile int flag = 0;private int ordinaryVar = 1;public void write() {ordinaryVar = 2; // 普通写操作flag = 1; // volatile写,带有StoreStore屏障和StoreLoad屏障}public void read() {int localFlag = flag; // volatile读,带有LoadLoad屏障和LoadStore屏障int localVar = ordinaryVar; // 普通读操作System.out.println("localFlag: " + localFlag + ", localVar: " + localVar);}
}

这个例子中,write方法先进行了一个普通的写操作,然后写入了一个volatile变量,这将插入必要的内存屏障。read方法首先读取了volatile变量,确保所有之前的写操作对当前线程可见,然后再进行普通的读操作。

总结

虽然Java程序员在编写日常代码时不直接与内存屏障打交道,了解内存屏障的工作原理对于理解JMM的内存可见性和操作的有序性至关重要。通过对volatile变量的操作、synchronized块的进入和退出,以及final字段的写操作,Java在底层自动插入相应的内存屏障,从而保证多线程环境中的内存一致性和线程安全。

http://www.lryc.cn/news/339752.html

相关文章:

  • 什么是流量清洗?
  • 淘宝API(通过商品详情接口采集商品页面数据)请求说明文档|可接入测试key
  • 示例说明闭包函数
  • 【自媒体创作利器】AI白日梦+ChatGPT 三分钟生成爆款短视频
  • 把握零碎时间,开启长期副业兼职之旅!在家也能轻松赚钱!
  • HarmonyOS开发实例:【数字管家app】
  • 人工智能_大模型033_LangChain003_记忆封装Memory上下文控制机制_LCEL表达式语言---人工智能工作笔记0168
  • 持安科技与顺丰正式签约!共建零信任应用安全最佳实践
  • Elasticsearch分布式搜索
  • 【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效,灰度、负片、像素化特效
  • ECMA进阶1之从0~1搭建react同构体系项目1
  • 【回溯】Leetcode 22. 括号生成【中等】
  • Java生成带数字的图片
  • FreeSWITCH 1.10.10 简单图形化界面17 - ubuntu22.04或者debian12 安装FreeSWITCH(IamFree)
  • 【数据结构】06图
  • Flink作业 taskmanager.numberOfTaskSlots 这个参数有哪几种设置方式
  • 京东详情比价接口优惠券(2)
  • Python knn算法
  • [大模型]Langchain-Chatchat安装和使用
  • K8S之资源管理
  • Grok-1.5 Vision:X AI发布突破性的多模态AI模型,超越GPT 4V
  • 【御控物联】Java JSON结构转换(1):对象To对象——键值互换
  • 【学习笔记】rt-thread
  • 一文掌握 React 开发中的 JavaScript 基础知识
  • 读天才与算法:人脑与AI的数学思维笔记01_洛夫莱斯测试
  • 嵌入式系统的时间保存问题,hwclock保存注意事项
  • jenkins(docker)安装及应用
  • uni-app中,页面跳转前,进行拦截处理的方法
  • Jmeter参数化的 4 种方式用法总结
  • 华为OD机试 - 连续天数的最高利润额(Java 2024 C卷 100分)