news 2026/8/29 23:29:04

JVM - 线程安全和锁

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM - 线程安全和锁

当多个线程同时访问一个共享的、可变的资源(如变量、对象、文件等)时,无论操作系统如何调用这些线程,也不论线程间的执行顺序如何交织,程序都能表现出正确的行为,并且不需要额外的同步或协调操作,那就称这个资源是线程安全的。

线程不安全的根源

在开始之前我们先了解一下硬件上的一些处理。

CPU缓存

CPU缓存的出现是为了CPU极致运算速度与主内存相对缓慢速度之间的巨大性能差距,被称为冯·诺伊曼瓶颈。现代CPU通常采用三层缓存结构:

L1缓存:最靠近CPU核心,集成在CPU核心内部,速度最快,访问延迟通常只有1~3个CPU时钟周期;容量是三级缓存里最小的;核心直接使用的数据和指令都来自这里,尽可能快的满足核心的要求。

L2缓存:同样位于CPU核心内部或非常接近核心,速度比L1缓存慢,访问延迟约10~20个时钟周期;作为L1缓存的后备仓库,当L1缓存未命中时,CPU会到L2缓存中查找数据,查找到数据,就将数据返回L1缓存;容量要比L1要大。

L3缓存:由一个CPU插槽上所有核心共享,速度最慢,访问延迟约20~50个时钟周期;但是容量最大;作为所有核心的共享缓冲池,当不同核心需要访问相同数据时,可以从L3快速获取,避免直接访问慢速的主内存,取到数据后将数据返回L2;如果L3中也没有相关数据,才需要访问最慢的主内存。同时也是维护缓存一致性协议(如MESI协议)的关键层面,核心之间通过L3来同步数据的修改。

局部性原理

缓存行:通过一次性加载一个数据块,而不是单个数据项,可以大幅减少访问内存的次数。缓存行的出现是基于时间局部性和空间局部性原理引入的。

时间局部性:如果一个数据被访问,那么它很可能在不久的将来再次被访问。因此尽量重用已经访问过的数据,让它快速留在L1/L2缓存中。

空间局部性:如果一个内存位置被访问,那么它附近的内存位置也可能很快被访问。因此尽量顺序访问数据,充分利用缓存行的预取机制。

缓存一致性

由于每个CPU都有自己的私有缓存,这就导致一个问题:同一个内存地址的数据,可能在多个核心的缓存中都存在副本,如果一个核心修改了自己缓存中的副本,其他核心如何能知道这个数据已“过期”?

缓存一致性协议就是用来解决这个问题的硬件机制,最著名的就是MESI,定义了缓存行的四种状态:

状态全称含义当前核心可否写入?其他核心是否有副本?缓存行数据是否最新?
MModified (修改)“脏”数据。缓存行已被修改,与主内存中的数据不一致。这是唯一的有效副本。可以(独占)(但内存中不是)
EExclusive (独占)“干净”数据。缓存行与主内存一致,且只有当前核心有该副本。可以(写入后变为 M)
SShared (共享)“干净”数据。缓存行与主内存一致,但可能有多个核心有该副本。不可以
IInvalid (无效)缓存行中的数据是过时、无效的,不能使用。不可以-(无意义)

当一个核心A读取数据时,如果发现不在自己的缓存中,就在总线上发出“读”请求,如果其他核心都没有这个数据的副本,内存直接提供数据,此核心将缓存行的状态设为E;如果其他核心有这个数据的副本,这些核心会做响应,同时将自己缓存行的状态改为或者保持为S,核心A将自己缓存行状态也设为S。

当核心A要写数据时,判断自己缓存行状态为E时,就直接写入数

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 10:15:47

CTF 解题核心思维 + 新手入门全攻略

CTF 解题核心思维 新手入门全攻略 很多人入门时把精力全花在工具操作上,却忽略了 CTF 的核心是思维逻辑 而非操作技巧。 本文跳出工具罗列 题型堆砌的传统思路,从解题核心思维链、新手三阶入门路径、实战案例拆解三大维度,帮你建立看到题目…

作者头像 李华
网站建设 2026/8/30 3:58:51

2026PCB产业高端化浪潮与慕尼黑上海电子展的连接枢纽

近年来,全球电子制造产业链加速重构,亚洲地区凭借在劳动力、资源、政策和产业聚集方面的突出优势,成为全球PCB(印刷电路板)产能转移的核心目的地。自2006年以来,中国大陆地区的PCB产量和产值一直居于世界前…

作者头像 李华
网站建设 2026/8/30 4:10:02

揭秘Web组件的隐形守护者:影子DOM如何彻底改变前端开发格局!

你是否曾经在项目中被CSS样式冲突折磨得焦头烂额?是否在团队协作中因为样式污染而陷入无尽的调试漩涡?今天,我要向你揭示一个被大多数前端开发者忽视的宝藏技术——影子DOM(Shadow DOM),它不仅能彻底解决样…

作者头像 李华
网站建设 2026/8/29 16:15:27

AI基于Springboot的图书馆在线占座系统_s58324g1

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/8/29 6:31:44

从零构建Agent:大模型智能代理的六步落地指南!

简介 文章介绍了构建高质量Agent的六步完整方法论:1)用具体示例定义任务;2)设计操作流程(SOP);3)用提示词构建MVP;4)连接与编排;5)测试与迭代;6)部署扩展与优化。通过邮件代理案例,强调从小处着…

作者头像 李华
网站建设 2026/8/29 12:16:13

股票历史分时BOLL数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据

在金融科技飞速发展的当下,股票数据API成为投资者、开发者和金融分析师获取股票市场的重要工具。无论是在开发量化交易策略,还是进入深入的金融数据分析,选一个合适的股票数据API至关重要。在量化分析领域,实时、准确的接口太重要…

作者头像 李华