写屏障和读屏障的区别是什么?


写屏障(Write Barrier)与读屏障(Read Barrier)的区别

在计算机科学中,写屏障读屏障是两种关键的内存同步机制,主要用于解决并发编程中的可见性、有序性问题,或在垃圾回收(GC)中维护内存一致性。它们的核心区别在于触发的操作类型、应用场景及实现目标。以下是详细对比:


1. 定义与核心作用

类型定义核心作用
写屏障写操作前后插入的同步指令或逻辑,确保写操作的顺序性和可见性。防止写操作重排序,确保其他线程能及时看到修改后的值。
读屏障读操作前后插入的同步指令或逻辑,确保读操作的顺序性和数据有效性。防止读操作重排序,确保读取的是最新值或符合预期的状态。

2. 应用场景

(1) 并发编程中的内存屏障
  • 写屏障

    • 场景:在多线程中,当一个线程修改共享变量后,需确保该修改对其他线程可见。
    • 实现
      在写操作后插入StoreStoreStoreLoad屏障,强制将写操作结果刷到主内存。
      示例volatile变量的写操作会自动插入写屏障。
      volatile int x = 1;
      // 写操作后插入StoreLoad屏障,确保写完成且后续读能看到新值
      
  • 读屏障

    • 场景:当一个线程读取共享变量时,需确保读取的是最新值,而非本地缓存的旧值。
    • 实现
      在读操作前插入LoadLoadLoadStore屏障,强制从主内存重新加载数据。
      示例volatile变量的读操作会自动插入读屏障。
      int y = x; // 读volatile变量x,插入LoadLoad屏障确保读取最新值
      
(2) 垃圾回收(GC)中的屏障
  • 写屏障(GC Write Barrier)

    • 场景:在并发标记或移动式GC(如G1、ZGC)中,跟踪对象引用的修改,防止漏标或误标。
    • 实现
      当程序修改对象A的引用指向对象B时,写屏障记录此次修改(如将B加入标记队列)。
      示例:在CMS的并发标记阶段,写屏障用于记录跨代引用。
  • 读屏障(GC Read Barrier)

    • 场景:在增量式GC或并发压缩(如Shenandoah)中,确保读取的引用是有效的。
    • 实现
      当程序读取对象引用时,读屏障检查该引用是否已被移动或无效,必要时触发修复逻辑。
      示例:ZGC使用读屏障实现染色指针,检查引用是否指向有效地址。

3. 底层实现对比

维度写屏障读屏障
触发时机写操作(如赋值、字段更新)后触发。读操作(如加载变量、访问字段)前触发。
硬件指令对应StoreStoreStoreLoad屏障(如x86的mfence)。对应LoadLoadLoadStore屏障(如x86的lfence)。
性能开销较高(需刷写缓存到内存)。较低(仅需刷新本地缓存或加载最新值)。
典型应用- volatile
- 锁释放
- GC中的引用更新跟踪
- volatile
- 锁获取
- GC中的引用有效性检查

4. 实际案例

(1) Java中的volatile变量
  • 写屏障

    volatile int sharedVar = 10;
    // 写操作后插入StoreStore + StoreLoad屏障,确保:
    // 1. 当前线程的写操作对其他线程可见。
    // 2. 禁止与后续操作重排序。
    
  • 读屏障

    int value = sharedVar; // 读操作前插入LoadLoad + LoadStore屏障,确保:
    // 1. 从主内存加载最新值。
    // 2. 禁止与之前操作重排序。
    
(2) 垃圾回收器中的屏障
  • G1 GC的写屏障

    • 当对象A的字段从指向B改为指向C时,写屏障将旧引用B和新引用C加入SATB(Snapshot-At-The-Beginning)队列,供并发标记使用。
  • ZGC的读屏障

    • 读取对象引用时,检查指针元数据(颜色标记),若对象已被移动,则通过读屏障转发到新地址。

5. 性能与权衡

类型优势劣势
写屏障确保数据修改的及时可见性,避免其他线程读取脏数据。频繁写操作时性能损耗较大(如大量volatile写)。
读屏障按需加载最新数据,减少不必要的内存同步开销。读操作可能延迟(需等待屏障逻辑完成)。

尾声

  • 写屏障:关注写操作的有序性与可见性,用于同步数据修改、GC引用跟踪等场景。
  • 读屏障:关注读操作的有序性与数据有效性,用于同步数据加载、GC引用检查等场景。
  • 核心区别
    • 写屏障解决“如何让其他线程看到我的修改”问题。
    • 读屏障解决“如何确保我读到的是最新有效数据”问题。

在这里插入图片描述

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

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

相关文章

ssh -T git@github.com 测试失败解决方案:修改hosts文件

问题描述 通过SSH方式测试,使用该方法测试连接可能会遇到连接超时、端口占用的情况,原因是因为DNS配置及其解析的问题 ssh -T gitgithub.com我们可以详细看看建立 ssh 连接的过程中发生了什么,可以使用 ssh -v命令,-v表示 verbo…

大疆无人机搭载树莓派进行目标旋转检测

环境部署 首先是环境创建,创建虚拟环境,名字叫 pengxiang python -m venv pengxiang随后激活环境 source pengxiang/bin/activate接下来便是依赖包安装过程了: pip install onnxruntime #推理框架 pip install fastapi uvicorn[standard] #网络请求…

00 Ansible简介和安装

1. Ansible概述与基本概念 1.1. 什么是Ansible? Ansible 是一款用 Python 编写的开源 IT 自动化工具,主要用于配置管理、软件部署及高级工作流编排。它能够简化应用程序部署、系统更新等操作,并且支持自动化管理大规模的计算机系统。Ansibl…

Linxu实验五——NFS服务器

一.NFS服务器介绍 NFS服务器(Network File System)是一种基于网络的分布式文件系统协议,允许不同操作系统的主机通过网络共享文件和目录3。其核心作用在于实现跨平台的资源透明访问,例如在Linux和Unix系统之间共享静态数据&#…

『 测试 』测试基础

文章目录 1. 调试与测试的区别2. 开发过程中的需求3. 开发模型3.1 软件的生命周期3.2 瀑布模型3.2.1 瀑布模型的特点/缺点 3.3 螺旋模型3.3.1 螺旋模型的特点/缺点 3.4 增量模型与迭代模型3.5 敏捷模型3.5.1 Scrum模型3.5.2 敏捷模型中的测试 4 测试模型4.1 V模型4.2 W模型(双V…

红外遥控键

红外 本章节旨在让用户自定义红外遥控功能,需要有板载红外接收的板卡。 12.1. 获取红外遥控键值 由于不同遥控器厂家定义的按键键值不一样,所以配置不通用,需要获取实际按键对应的键值。 1 2 3 4 5 6 #设置输出等级 echo 7 4 1 7> /pr…

同一个虚拟环境中conda和pip安装的文件存储位置解析

文章目录 存储位置的基本区别conda安装的包pip安装的包 看似相同实则不同的机制实际路径示例这种差异带来的问题如何检查包安装来源最佳实践建议 总结 存储位置的基本区别 conda安装的包 存储在Anaconda(或Miniconda)目录下的pkgs和envs子目录中: ~/anaconda3/en…

机器学习极简入门:从基础概念到行业应用

有监督学习(supervised learning) 让模型学习的数据包含正确答案(标签)的方法,最终模型可以对无标签的数据进行正确处理和预测,可以分为分类与回归两大类 分类问题主要是为了“尽可能分开整个数据而画线”…

split和join的区别‌

split和join是Python中用于处理字符串的两种方法,它们的主要区别在于功能和使用场景。‌ split()方法 ‌split()方法用于将字符串按照指定的分隔符分割成多个子串,并返回这些子串组成的列表‌。如果不指定分隔符,则默认分割所有的空白字符&am…

MySQL从入门到精通(二):Windows和Mac版本MySQL安装教程

目录 MySQL安装流程 (一)、进入MySQL官网 (二)、点击下载(Download) (三)、Windows和Mac版本下载 下载Windows版本 下载Mac版本 (四)、验证并启动MySQL …

LeetCode 解题思路 45(分割等和子集、最长有效括号)

解题思路: dp 数组的含义: 在数组中是否存在一个子集,其和为 i。递推公式: dp[i] | dp[i - num]。dp 数组初始化: dp[0] true。遍历顺序: 从大到小去遍历,从 i target 开始,直到 …

电影感户外哑光人像自拍摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!

调色详情 电影感户外哑光人像自拍摄影 Lr 调色,是借助 Lightroom 软件,针对户外环境下拍摄的人像自拍进行后期处理。旨在模拟电影画面的氛围与质感,通过调色赋予照片独特的艺术气息。强调打造哑光效果,使画面色彩不过于浓烈刺眼&a…

使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据

作者:来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会,了解如…

Android 13 使能user版本进recovery

在 debug 版本上,可以在关机状态下,同时按 电源键 和 音量加键 进 recovery 。 user 版本上不行。 参考 使用 build 变体 debug 版本和 user 版本的差别之一就是 ro.debuggable 属性不同。 顺着这个思路追踪,找到 bootable/recovery/reco…

每日算法刷题计划

这是我每天坚持刷算法题的仓库,每天刷1-3道,时间30-40min,加油! 目前考虑leetcode洛谷形式,c和python3语言,leetcode主要学核心思想,洛谷学会输入输出格式 每日打卡:markdowncsdn打卡 刷题策略: 按分类刷…

红黑树():

1. 红黑树: 红黑树从根节点开始的最长的路径不会超过最短路径的2倍。 红黑树的话,他的结点的分布没有我们的AVL树的结点的分布均衡,但是效率也不错,AVL树的结点分布的那么均匀,其实也是在进行了旋转,付出了…

【AI智能推荐系统】第六篇:隐私保护与联邦学习在推荐系统中的平衡之道

第六篇:隐私保护与联邦学习在推荐系统中的平衡之道 提示语:🔥 “数据不出域,推荐更精准!深度揭秘腾讯、蚂蚁集团如何用联邦学习打造合规推荐系统,隐私计算技术全景解析与工业级实现方案!” 目录 隐私保护的行业挑战隐私计算技术体系 2.1 联邦学习基础架构2.2 差分隐私…

【Qt/C++】深入理解 Lambda 表达式与 `mutable` 关键字的使用

【Qt/C】深入理解 Lambda 表达式与 mutable 关键字的使用 在 Qt 开发中,我们常常会用到 lambda 表达式来编写简洁的槽函数。今天通过一个实际代码示例,详细讲解 lambda 的语法、变量捕获方式,特别是 mutable 的作用。 示例代码 QPushButto…

记录 ubuntu 安装中文语言出现 software database is broken

搜索出来的结果是 sudo apt-get install language-pack-zh-han* 然而,无效,最后手动安装如下 apt install language-pack-zh-hans apt install language-pack-zh-hans-base apt install language-pack-gnome-zh-hans apt install fonts-arphic-uming apt install libreoffic…

[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)

原英文教程地址深入理解实时渲染(An In-Depth Look at Real-Time Rendering) 文章目录 1.Intro to An In-Depth Look at Real-Time RenderingCPU VS GPUDeferred VS Forward 2. Before Rendering and OcclusionCulling计算的步骤使用console command:fre…