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

并发编程可见性

一句话定义

可见性就是当一个线程修改了某个共享变量,其他线程能够立马看到这个最新变化的结果。

理解过程 #内存模型

核心点:CPU的内存模型、硬件的MESI、JIT指令冲排序
存数据:多核CPU的架构下,计算机要某个变量会先发起一个为写入准备的读请求(RFO),分别从L1->L2->L3查找。如果都不存在(缓存未命中),则去内存中查找(必然命中)。在将内存中的值加载到L1缓存之前由L3协调,使其他核心中包含该变量的整个缓存行副本失效。随后数据被加载到L1缓存,核心立即获得独占权。L1对该变量赋值并将状态改成已修改L3会记录此独占状态。此刻主内存中的值还是旧值。
读数据: 当核心2想要读取存在于核心1(状态为M)的数据时,核心2会先查看自身缓存。未命中后,请求最终到达L3。L3发现数据由核心1独占且已修改,会触发缓存一致性协议。此时,通常有两种结果

  1. 高效干预:核心1嗅探到请求,直接将自己L1/L2中的最新数据返回给核心2(可能同时写回L3),核心2将数据载入自己的L1。

  2. 标准写回:核心1先将数据写回L3,随后L3再将数据提供给核心2,数据会填充核心2的L2和L1缓存
    无论哪种方式,最终核心1和核心2的该缓存行状态都变为共享

内存模型
image

问题:MESI保证了硬件层面的缓存内存一致性,就算Java编译器导致指令重排序也不应该出现下面这个程序的问题,主线程修改了flag的值,但是线程t1仍旧不会停止,怎么解释

public class Visible {  public static boolean flag = true;  public static void main(String[] args) throws InterruptedException {  Thread t1 = new Thread(() -> {  while (flag) {  // do something  }  System.out.println("t1 结束");  });  t1.start();  Thread.sleep(10);  flag = false;  System.out.println("main end");  }  
}

虽然很多人都是是指令重排序导致的,但是这里其实是因为Java编译器对线程内部的这段代码做了优化,他发现当前线程的flag是不会改变的,导致把while循环里的flag改成了true,导致程序无法退出。

解决什么问题

解决了在并发场景下,线程A修改的共享变量,线程B不可见的问题。

解决方案
  • 可以通过变量前用volatile修饰符修饰
  • 可以使用synchronized锁
  • 可以使用ReentrantLock锁,最后一定要finally中unlock
  • 使用final关键字,不可更改,所以不会出现不可见的情况
http://www.zskr.cn/news/13985.html

相关文章:

  • VsCode Ai插件
  • 写入方式、COW 与写放大
  • 黄金分割比
  • how create rhel8 local repository server
  • 借助Aspose.Email,使用 Python 读取 Outlook MSG 文件
  • 文件同步工具深度测评(2025版):同步盘夺冠
  • Oracle故障处理:数据库启动时遇到ORA-01578错误
  • AGC073C 赛后补题记录
  • 深入解析:【深度学习计算机视觉】03:目标检测和边界框
  • leetCode刷题记录1
  • 【Bluedroid】A2DP Source 音频流暂停流程解析[5]:停止流程及资源管理机制(btif_a2dp_source_stop_audio_req) - 教程
  • 【IEEE-CPS出版】2025年数据管理与计算机科学国际学术会议(ICDMCS 2025)
  • 实用指南:Unity单元测试:C语言轻量级框架实战
  • 【ACM出版】第五届管理科学和软件工程国际学术会议(ICMSSE 2025)
  • 标签化模板之styled-components原理
  • Halcon基础——图像增强
  • Day24接口的定义与实现
  • 题解:CF2146D2 Max Sum OR (Hard Version)
  • NVIDIA 开源 Audio2Face:音频生成逼真面部动画;Gemini Live API 支持思考能力 丨日报
  • 个人用云计算学习笔记 --14( Linux 逻辑卷管理、Linux 交换空间管理) - 教程
  • Print Conductor打印软件安装教程!一款非常好用的批量打印软件!支持PDF、Word、Excel、图片等
  • Python 面向对象编程基础:类与对象初体验
  • Drools 7.0基础环境搭建
  • 基于微信小程序的旅游景点体系【2026最新】
  • 反电动势法控制BLDC电机的原理图分析
  • 2025内网聊天工具排行 4款好用的内网聊天软件推荐
  • 方言普通话识别大模型,支撑中英+202种方言识别
  • BLE从机(20)BLE区分主机(IOS/安卓/WIN)
  • Gitee:中国开发者生态的数字化转型加速器
  • 大模型提示词技巧Prompt Engineering,看这一篇就够了 - 知乎