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

为什么 synchronized 不能防止指令重排序?

在某乎看到一个提问大家讨论synchronized能不能防止指令冲排序咋说的都有我发现大家学习底层技术很多时候会有误区。先说我的观点synchronized 绝对不能防止它内部代码的指令重排序下边说说我的分析哈不对的大家讨论synchronized 到底防了什么很多人觉得 synchronized 能防重排序是因为看到了它能保证有序性这句话。但这句话是有大前提的打个比方synchronized 就像是一间带锁的单人洗手间。并发视角的有序性线程 A 进去了把门反锁线程 B 只能在门外排队。A 出来之后B 才能进去。线程 B 看来A 在里面的所有动作是一次性做完的这就叫保证了有序性和原子性。但是线程 A 关上门之后在洗手间里到底是先脱裤子再上厕所还是先脱衣服再洗脸CPU 和编译器为了追求极致的执行效率是完全可能把 A 在洗手间里的动作顺序打乱的指令重排序。只要 A 在洗手间里的瞎搞不影响最终结果CPU 就觉得没毛病。synchronized 根本管不住 CPU 在单线程内部的微操。双重检查锁DCL为什么要加volatile我们来看看经典的 DCL 单例是怎么写的public class Singleton { // 注意这里如果不加 volatile将引发灾难 privatestatic Singleton instance; public static Singleton getInstance() { if (instance null) { // --- 致命的第一重检查在锁外面 synchronized (Singleton.class) { if (instance null) { instance new Singleton(); // --- 万恶之源 } } } return instance; } }这段代码看着没啥毛病外层判断空避开锁的性能开销。内层加锁保证只有一个线程去 new 对象。坑就坑在 instance new Singleton() 这句代码上。因为Java 字节码和CPU执行层面他就不是一个原子操作它被分成三步1、分配内存空间2、初始化对象执行构造函数3、将 instance 引用指向分配的内存地址正常人的逻辑是 1 - 2 - 3。但是前面说了哈synchronized 管不住洗手间里面的重排序。CPU 一看步骤 2 和 3 互相不依赖啊为了效率我给你优化成 1 - 3 - 2 吧。灾难发生的全过程假设这时候发生了 1 - 3 - 2 的重排序线程 A 进到了 synchronized 块里开始执行 new Singleton()。线程 A 执行了步骤 1然后执行了步骤 3。注意此时对象还没执行构造函数但 instance 已经不是 null 了就在这极其致命的瞬间线程 B 杀过来了。线程 B 执行第一句代码 if (instance null)。注意这句代码是在 synchronized 外面的线程 B 根本不需要等锁线程 B 看到 instance ! null对象 new 好了直接 return instance 拿去用。结果线程 B 拿到的是一个还没执行构造函数的半成品对象线程 B 调用里面的成员变量直接爆出 NullPointerException 或者拿到错乱的初始值系统当场崩溃。发现问题了吗synchronized 确实能把线程 A 锁在里面但它防不住线程 B 在外面偷看因为 DCL 最大的卖点就是第一层检查没有加锁这就是为什么必须给 instance 加上 volatile 关键字private static volatile Singleton instance;volatile 的核心作用除了大家熟知的保证内存可见性之外在 DCL 这个场景下最关键的作用是插入内存屏障禁止指令重排序。加了 volatile 之后CPU 和编译器看到这个变量就会老老实实地立正站好。它强制要求必须先完全执行完步骤 1 和 2 才能执行步骤 3。这样一来只要线程 B 看到 instance ! null那么这个对象绝对是可用的不会拿到半成品。

相关文章:

为什么 synchronized 不能防止指令重排序?

在某乎看到一个提问,大家讨论 synchronized 能不能防止指令冲排序,咋说的都有,我发现大家学习底层技术很多时候会有误区。先说我的观点:synchronized 绝对不能防止它内部代码的指令重排序!下边说说我的分析哈&#xff…...

all-in-rag零散的笔记(自存/持续更新)

2026.3.17原文说的很详尽,写这么一篇只是为了让自己背的更顺。------1.让代码只输出content?print(answer.content)补充:其中,answer llm.invoke(prompt.format(questionquestion, contextdocs_content))该代码先把 question&…...

COMSOL煤矿模型仿真合集:‘瓦斯抽采与热流固耦合、采空区耦合性分析、倾斜煤层下的采空区参数...

comsol煤矿模型仿真合集 comsol煤矿(地下水流)模型整理合集, 1.图1-2为瓦斯抽采热流固耦合,采用固体力学、达西和多孔介质传热研究瓦斯抽采下煤层温度、应力、瓦斯渗流的变化情况。 2.图3-4为采空区耦合性分析,贴合一篇…...

AI聊天机器人安全漏洞:暴力诱导与风险警示

AI聊天机器人暴力诱导事件时间线与影响规模近期,一个倡导组织公布了对10款人工智能聊天机器人的研究结果。自去年11月至12月进行测试后,几家聊天机器人制造商称已做出改进以提升安全性。今日,与CNN记者合作开展研究的反数字仇恨中心&#xff…...

目前主流AI绘画工具排名,功能参数全对比

本文对2026年主流AI绘画工具进行功能维度的详细盘点,包括核心功能、技术参数、模型生态、价格等,供开发者和专业用户参考选型。一、主流AI绘画工具概览工具开发方核心技术部署方式访问方式MidjourneyMidjourney Inc.自研模型SaaS需海外访问Stable Diffus…...

MySQL分库分表的实现(二)--水平分表

本文介绍下使用Sharding-JDBC实现水平分表 Sharding-JDBC是轻量级的 java 框架,是增强版的 JDBC 驱动,使用Sharding-JDBC可以简化对分库分表之后数据相关操作。下面分别介绍下水平分表的方法。 1、准备好数据库和数据表 先创建一个course_db数据库,然…...

B2B战略咨询在行业竞争中实现差异化突围

在激烈的行业竞争中,B2B战略咨询发挥了重要作用。通过创新解决方案和个性化服务,企业能够实现显著的差异化,从而提升市场竞争力。咨询公司首先需要进行深入的市场需求分析,以识别客户的真实需求和痛点。这一过程帮助企业围绕客户体…...

第七届人工智能、网络与信息技术国际学术会议(AINIT 2026)

第七届人工智能、网络与信息技术国际学术会议(AINIT 2026)将于2026年5月15-17日在中国大连举行。本届会议将主要关注人工智能、网络与信息技术面临的新的挑战问题和研究方向,着力反映国际人工智能、网络与信息技术相关技术研究的最新进展。大…...

3·15曝光后深度解析:AI“投毒”与幻觉乱象,GEO技术困局与破局之道

2026年央视315晚会曝光的GEO(生成式引擎优化)黑产,给所有AI领域技术从业者(程序员、算法工程师、数据工程师等)敲响了警钟——批量虚假信息“投毒”污染大模型,导致多个主流大模型在“2026年315晚会”这一基…...

小龙虾时代:用于安全连接——内网穿透工具Tailscale 实用手册

Tailscale 在linux Windows 场景下的使用***这里的linux以ubuntu为例,mac同理适合: 你有一台 Ubuntu 桌面机(比如养小龙虾放资料)你想从 Windows 安全地连接过去你把 安全 放在第一位你希望这份说明能 拿来就用1. Tailscale 到底是…...

担心 openclaw 软件带毒?域卫 Yvevos 帮你一键系统级隔离风险

高权限软件运行的最佳解决方案在日常工作中,OpenClaw 是一款功能强大的工具,但它需要接管操作系统所有权限。这也导致了很多兄弟不敢用,心里直打鼓:“万一这个软件带毒怎么办?它权限这么大,会不会把我的主机…...

8.3负载生成工具

8.3 负载生成工具 实时性测试不仅要满足系统空载或低负载时的时延要求,还必须满足高负载情况下的时延要求。 通过负载生成工具模拟高负载场景进行压力测试,是评估实时系统在高负载情况下的稳定性和可靠性的有效手段。 压力测试是一种破坏性的测试&…...

vue-django flask+uniapp 小程序 特色农产品商城购物交易系统

目录技术选型与架构设计核心功能模块关键技术实现测试与部署扩展性设计项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 前端框架:UniApp(跨端开发&#xff…...

五相svpwm调制。 (五相永磁同步电机矢量控制,相邻四矢量,二矢量,文档说明+)

五相svpwm调制。 (五相永磁同步电机矢量控制,相邻四矢量,二矢量,文档说明)五相电机的矢量舞蹈比三相系统有趣得多。当我们把传统的三相桥臂拓展到五相时,电压矢量的分布从六边形变成了十边形,就…...

晶振激励功率和负性阻抗实测及计算方法

尽管在晶振振荡电路设计之前,我们都会从IC方案中获取晶振相关信息,如晶振封装、频率、频差、负载电容、工作电压等,但在晶振实际电路应用中,我们却会遇到一些具体问题,比如按照BOM采购晶振,在电路板上电后&…...

Kotlin的reified泛型:在运行时保留类型信息

Kotlin的reified泛型:在运行时保留类型信息 在Java的泛型系统中,类型擦除是一个广为人知的限制——泛型类型信息在编译后会被擦除,导致运行时无法直接获取类型参数的具体信息。Kotlin通过reified关键字打破了这一限制,允许开发者…...

英语基础输入提升指南

英语基础输入提升指南 目标人群:出国旅游基础对话、日常看懂基础英文(路牌、菜单、简单新闻) 核心原则:i1 理论(材料难度略高于当前水平,但可理解) 生成时间:2026-03-17&#x1f4cc…...

飞函如何把即时通讯、会议和云盘真正做成一体化协同底座

很多企业已经配置了不少“协同工具”:一个聊天软件、一个会议系统、一个网盘,再加上 OA、ERP、CRM 等业务系统。表面看功能齐全,实际落地时却经常出现同一个问题: 沟通、决策、文件和执行是分开的。 研发在群里讨论需求,会议里敲定…...

Spring的@Configuration注解:深入解析与实战指南

Spring的Configuration注解:深入解析与实战指南 在Spring框架中,Configuration注解是一个非常重要的注解,用于标记一个类为配置类。配置类用于定义和管理Spring容器中的Bean。本文将深入探讨Configuration注解的使用,帮助你更好地…...

保姆级STM32CubeMX入门攻略(CSDN博客版)

一、下载前准备:避坑清单先收好1. 拒绝第三方资源:别信“百度网盘破解版”“精简版”,不仅有病毒风险,还会缺固件包,安装后报错找不到芯片; 2. 必备环境:STM32CubeMX基于Java开发,需…...

CC工具箱使用指南:【查找面要素的狭窄部位】

一、简介 之前做过一个查找狭窄面的工具,只是针对整体面的一个判断。 但是如果一个面只是一个角存在狭窄的区域,就很难判断: 这种情况下,要这个狭窄区域找出来是很有必要的,于是就做了这个工具。 注意,这…...

3分钟搞定!OpenClaw 龙虾 + Kimi 联网搜索,小白也能上手

哈喽,大家好!我是阿星👋龙虾本身是没有搜索能力的。你可以利用tavily search skills搜索,也可以用openclaw的brave search websearch tool 进行搜索(后者是要钱的,前者可能有点时效问题)。国内新…...

【程序员转型】开发者转型成为 AI 工程师指南,大模型入门到精通,收藏这篇就足够了!

本文为开发者转型 AI 工程师提供了必备技能与职业路径的全面指南。 AI 工程师的需求前所未有地高涨,成为科技领域增长最快的职业之一。该岗位融合了传统软件开发与机器学习能力,对开发者而言既是机遇,也是现有编程技能的自然进化。你可以在此…...

Git误删急救:30秒拯救你的代码

Git误操作急救手册大纲常见误操作场景误删文件或代码未提交的本地修改被删除已提交的文件被误删误提交或提交错误内容提交了敏感信息(如密码、密钥)提交了错误文件或大文件分支操作失误误删分支(本地或远程)强制推送导致历史覆盖撤…...

大模型联网难题破解!数眼智能(DataEyes)全解析,5分钟解锁实时数据能力

ChatGPT、文心一言、Gemini等大模型落地AI项目时,普遍面临“实时信息获取难、网页数据提取杂、合规使用有风险”的困境,而过时信息、杂乱数据往往让AI应用实用性大打折扣。数眼智能(DataEyes)的核心价值,就是为大模型补…...

搞定2026年生鲜促销图,我的经验是别直接套模板

搞定2026年生鲜促销图,我的经验是别直接套模板我是生鲜电商店铺的运营,上周老板让我负责新品豇豆的推广,要求在周三下午之前做一张吸引人的线上促销海报。这是一个急活,但我自己用手机拍的几张豇豆照片,背景杂乱&#…...

语义之战:微软与帕兰提尔(Palantir)为何争夺你的企业本体(Ontology)

跳出数据湖与大模型:为何“意义层”成为智能体 AI 与业务主权的新前线一场无声的圈地运动正在上演。争夺的不是你的云预算,不是算力,而是决定自主 AI 智能体如何理解你数据含义的语义层。谁掌控了这层翻译层,谁就有权把企业决策直…...

TMC2208控制步进电机

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、两相四线步进电机基本介绍&#xff1f…...

vue表格vxe-table实现表头合并,分组表头自定义合并

在开发后台管理系统时,经常会遇到需要展示复杂表格的场景,其中表头合并(多级表头、不规则合并)是一项常见需求。vxe-table 是一款功能强大的 Vue 表格组件,它不仅支持树形分组表头,还提供了自定义列头合并的…...

【AI】----java的 大模型提示词 prompt ,代码输出提示规范

java的 大模型提示词 prompt ,代码规范■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■提示词■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■…...