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

多线程(线程安全)

一、线程安全的风险来源

1.1 后厨的「订单撞单」现象

场景:两服务员同时录入客人点单到同一个菜单本
问题

  1. 订单可能被覆盖
  2. 菜品数量统计错误

Java中的表现

public class OrderServlet extends HttpServlet {private int totalOrders = 0; // 共享计数器protected void doGet(HttpServletRequest req, HttpServletResponse resp) {totalOrders++; // 并发时错误}
}

二、线程安全三要素

2.1 问题的根源机制
问题类型厨房类比解决方案Java对应概念
原子性厨师查看库存到下单三步可能中断步骤打包成一个原子操作synchronized块
可见性更新库存忘记同步到总台中央公告板强制更新状态volatile关键字
有序性备菜与送餐顺序调换确保工序合理顺序避免指令重排

三、核心锁机制synchronized

3.1 后厨传菜窗口的排队系统
public class KitchenService {private final Object lock = new Object();public void processOrder(Order order) {synchronized(lock) { // 类似传菜窗口排队拿号// 处理食材库存和制作工序}}
}

重要特性

  • 重入性:大厨可以多次进出冷藏库(避免自锁)
  • 互斥性:同一时间只有一个窗口可取菜
  • 作用域:锁定单个对象(传菜窗口)或整个餐馆(类锁)

四、内存屏障volatile原理

4.1 实时更新的库存显示屏
class StockManager {public volatile int beefStock = 100; // 各后厨实时可见最新库存public void updateStock(int used) {beefStock -= used; // 注意:volatile无法保证多步原子性!}
}

为什么需要 volatile
new Singleton() 分为三步:

  1. 分配内存
  2. 初始化对象
  3. 将引用指向内存地址
    若没有 volatile,可能 JVM 会将 2 和 3 重排序,导致其他线程拿到未初始化的对象!

解决的问题

.可见性问题(强制刷新内存)
  • 问题表现
    A 线程修改了共享变量的值,但 B 线程看到的值还是旧的(因为 CPU 缓存未同步到主存)。
  • volatile 作用
    当一个线程修改 volatile 变量的值时,其他线程能立即看到最新值,如同直接操作主内存。让所有线程看见最新的自己,且不乱序.

适用场景

  • 菜单状态标记位(如是否停止接单)
  • 配置参数实时更新(动态调整菜品价格)

五、生产-消费协作模型

5.1 前厅与后厨的订单协作
public class Restaurant {private final BlockingQueue<Order> orderQueue = new LinkedBlockingQueue<>(20);// 服务员提交订单(生产者)void submitOrder(Order order) throws InterruptedException {orderQueue.put(order); }// 厨房处理订单(消费者)void processOrders() {while(true) {Order order = orderQueue.take();cook(order);}}
}

优势

  1.  削峰:用餐高峰避免厨师过载
  2. 解耦:前厅接单与厨房制作分离

六、单例模式安全实现

6.1 中央调料柜的双重检查
public class SpiceCabinet {private static volatile SpiceCabinet instance;public static SpiceCabinet getInstance() {if (instance == null) { // 第一次快速校验synchronized(SpiceCabinet.class) {if (instance == null) { // 二次确认instance = new SpiceCabinet();}}}return instance;}
}
第一个if语句(外层检查)

if (instance == null) { // 第一次快速校验

  • 作用:快速路径 (Fast Path)

    • 当实例已经存在时,直接跳过加锁步骤,立即返回实例。
    • 当实例不存在时,才会进入同步块竞争锁。
  • 解决的问题减少锁竞争
    如果去掉这层检查,每次调用getInstance()都必须加锁(无论实例是否已存在),导致即便实例已创建,线程仍需排队竞争锁,性能严重下降。

特点

  • 首次访问可能稍慢(需要加锁初始化)
  • 后续高效获取(无需锁竞争)
第二个if语句(内层检查)

if (instance == null) { // 二次确认

  • 作用:严格保序 (Strict Serialization)

    • 当多个线程同时通过外层检查进入同步块时(初始化阶段),防止多次创建实例。
    • 仅第一个获取锁的线程完成初始化,后续线程发现instance != null后直接返回。

常见误区说明 ✅❌

错误写法问题根源正确方案
去掉外层if每次调用均加锁,性能低下保留外层用于快速路径判断
去掉内层if允许初始化多次(破坏单例)内层确保锁内唯一性
volatile可能导致部分初始化对象被访问volatile禁用指令重排和强制同步

总结

双检锁双if的精髓在于:通过两次检查分别应对不同的并发场景

  • 外层if → 应对已初始化场景(高性能)
  • 内层if → 应对未初始化场景(安全性)

同时,volatile确保了这一机制在极端的并发环境下的最终正确性。

七、线程池管理策略

7.1 后厨人员的弹性调度
ExecutorService kitchenStaff = Executors.newCachedThreadPool(); // 订单到来动态分配厨师
public void handleOrder(Order order) {kitchenStaff.submit(() -> {prepareIngredients(order);cookDish(order);notifyServing(order);});
}

资源优化点

  • 核心厨师(corePoolSize)保持随时待命
  • 临时工(maximumPoolSize)应对就餐高峰
  • 空闲回收(keepAliveTime)降低运营成本

八.故障自排查

现象可能原因检查点
数据不一致未同步共享资源检查++/--操作是否有锁
吞吐量下降过度同步或锁竞争使用JConsole观察锁状态
CPU利用率异常高忙等待或无限制循环检查是否有sleep/等待机制
进程僵死死锁(互相等待资源)检测锁获取顺序是否一致

相关文章:

多线程(线程安全)

一、线程安全的风险来源 1.1 后厨的「订单撞单」现象 场景&#xff1a;两服务员同时录入客人点单到同一个菜单本 问题&#xff1a; 订单可能被覆盖菜品数量统计错误 Java中的表现&#xff1a; public class OrderServlet extends HttpServlet {private int totalOrders 0…...

开发了一个b站视频音频提取器

B站资源提取器-说明书 一、功能说明 本程序可自动解密并提取B站客户端缓存的视频资源&#xff0c;支持以下功能&#xff1a; - 自动识别视频缓存目录 - 将加密的.m4s音频文件转换为标准MP3格式 - 将加密的.m4s视频文件转换为标准MP4格式&#xff08;合并音视频流&#xff09;…...

基于javaweb的SpringBoot校园服务平台系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

北京SMT贴片加工工艺优化要点

内容概要 在北京地区SMT贴片加工领域&#xff0c;工艺优化是实现高可靠电子组装的系统性工程。本文以精密化生产需求为导向&#xff0c;围绕制程关键节点展开技术剖析&#xff0c;从钢网印刷的锡膏成型控制到贴装环节的视觉定位精度&#xff0c;逐步构建全流程优化模型。通过分…...

PHYBench:首个大规模物理场景下的复杂推理能力评估基准

2025-04-23, 由北京大学物理学院和人工智能研究所等机构共同创建的 PHYBench 数据集&#xff0c;这是一个专门用于评估大型语言模型在物理场景下的复杂推理能力的高质量基准。该数据集包含 500 道精心策划的物理问题&#xff0c;覆盖力学、电磁学、热力学、光学、现代物理和高级…...

将输入帧上下文打包到下一个帧的预测模型中用于视频生成

Paper Title: Packing Input Frame Context in Next-Frame Prediction Models for Video Generation 论文发布于2025年4月17日 Abstract部分 在这篇论文中,FramePack是一种新提出的网络结构,旨在解决视频生成中的两个主要问题:遗忘和漂移。 具体来说,遗忘指的是在生成视…...

使用localStorage的方式存储数据,刷新之后,无用户消息,需要重新登录,,localStorage 与 sessionStorage 的区别

1 localStorage 与 sessionStorage 的区别: 特性localStoragesessionStorage存储时长永久存储,除非手动删除或者清空浏览器缓存会话存储,浏览器关闭后数据丢失数据生命周期持久存在,直到被明确删除(即使关闭浏览器也不会消失)当前会话结束后数据自动清空(关闭标签页或浏…...

第15章:MCP服务端项目开发实战:性能优化

第15章:MCP服务端项目开发实战:性能优化 在构建和部署 MCP(Memory, Context, Planning)驱动的 AI Agent 系统时,性能和可扩展性是关键的考量因素。随着用户量、数据量和交互复杂度的增加,系统需要能够高效地处理请求,并能够平滑地扩展以应对更高的负载。本章将探讨 MCP…...

MOA Transformer:一种基于多尺度自注意力机制的图像分类网络

MOA Transformer&#xff1a;一种基于多尺度自注意力机制的图像分类网络 引言 近年来&#xff0c;Transformer 架构在自然语言处理领域取得了巨大的成功&#xff0c;并逐渐扩展到计算机视觉领域。Swin Transformer 就是其中一个典型的成功案例。它通过引入“无卷积”架构&…...

Red:1靶场环境部署及其渗透测试笔记(Vulnhub )

环境介绍&#xff1a; 靶机下载&#xff1a; https://download.vulnhub.com/red/Red.ova 本次实验的环境需要用到VirtualBox&#xff08;桥接网卡&#xff09;&#xff0c;VMware&#xff08;桥接网卡&#xff09;两台虚拟机&#xff08;网段都在192.168.152.0/24&#xff0…...

从 Java 到 Kotlin:在现有项目中迁移的最佳实践!

全文目录&#xff1a; 开篇语 1. 为什么选择 Kotlin&#xff1f;1.1 Kotlin 与 Java 的兼容性1.2 Kotlin 的优势1.3 Kotlin 的挑战 2. Kotlin 迁移最佳实践2.1 渐进式迁移2.1.1 步骤一&#xff1a;将 Kotlin 集成到现有的构建工具中2.1.2 步骤二&#xff1a;逐步迁移2.1.3 步骤…...

Java Collections工具类指南

一、Collections工具类概述 java.util.Collections是Java集合框架中提供的工具类&#xff0c;包含大量静态方法用于操作和返回集合。这些方法主要分为以下几类&#xff1a; 排序操作查找和替换同步控制不可变集合特殊集合视图其他实用方法 二、排序操作 1. 自然排序 List&…...

深入详解人工智能数学基础——概率论中的KL散度在变分自编码器中的应用

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

测试模版x

本篇技术博文摘要 &#x1f31f; 引言 &#x1f4d8; 在这个变幻莫测、快速发展的技术时代&#xff0c;与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮&#xff0c;一名什么都会一丢丢的网络安全工程师&#xff0c;也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...

Openharmony 和 HarmonyOS 区别?

文章目录 OpenHarmony 与 HarmonyOS 的区别&#xff1a;开源生态与商业发行版的定位差异一、定义与定位二、技术架构对比1. OpenHarmony2. HarmonyOS 三、应用场景差异四、开发主体与生态支持五、关键区别总结六、如何选择&#xff1f;未来展望 OpenHarmony 与 HarmonyOS 的区别…...

uniapp 仿小红书轮播图效果

通过对小红书的轮播图分析&#xff0c;可得出以下总结&#xff1a; 1.单张图片时容器根据图片像素定高 2.多图时轮播图容器高度以首图为锚点 3.比首图长则固高左右留白 4.比首图短则固宽上下留白 代码如下&#xff1a; <template><view> <!--轮播--><s…...

让Docker端口映射受Firewall管理而非iptables

要让Docker容器的端口映射受系统防火墙(如firewalld或ufw)管理&#xff0c;而不是直接通过iptables&#xff0c;可以按照以下步骤配置&#xff1a; 方法一&#xff1a;禁用Docker的iptables规则 &#xff08;1&#xff09;编辑Docker配置文件&#xff1a; vi /etc/docker/da…...

R/G-B/G色温坐标系下对横纵坐标取对数的优势

有些白平衡色温坐标系会分别对横纵坐标取对数运算。 这样做有什么优势呢? 我们知道对数函数对0-1之间的因变量值具有扩展作用。即自变量x变化比较小时,经过对数函数作用后可以把因变量扩展到较大范围内,即x变化较小时,y变化较大,增加了识别数据的识别性。 由于Raw数据中的…...

AI赋能安全调度系统:智能升级与功能跃迁

安全调度系统通过AI技术的深度整合&#xff0c;实现了从传统监控到智能决策的质变升级。这种智能化转型不仅提升了系统的响应速度和处理精度&#xff0c;更重塑了整个安全管理的运行范式。以下是AI技术为安全调度系统带来的核心功能强化&#xff1a; 智能风险识别与预警能力跃…...

数据结构与算法(十二):图的应用-最小生成树-Prim/Kruskal

相关文献&#xff1a; 数据结构与算法(一)&#xff1a;基础理论 数据结构与算法(二)&#xff1a;线性表的实现 数据结构与算法(三)&#xff1a;线性表算法设计练习 数据结构与算法(四)&#xff1a;斐波那契数列 数据结构与算法(五)&#xff1a;LRU 数据结构与算法(六)&#xff…...

项目——高并发内存池

目录 项目介绍 做的是什么 要求 内存池介绍 池化技术 内存池 解决的问题 设计定长内存池 高并发内存池整体框架设计 ThreadCache ThreadCache整体设计 哈希桶映射对齐规则 ThreadCache TLS无锁访问 CentralCache CentralCache整体设计 CentralCache结构设计 C…...

系统与网络安全------弹性交换网络(2)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 Eth-Trunk 组网中经常会遇到的问题 链路聚合技术 概述 Eth-Trunk&#xff08;链路聚合技术&#xff09;作为一种捆绑技术&#xff0c;可以把多个独立的物理接口绑定在一起&#xff0c;作为一个大带宽的逻辑…...

信息系统项目管理工程师备考计算类真题讲解八

一、风险管理 示例1&#xff1a;EMV 解析&#xff1a;EMV(Expected Monetary Value)预期货币价值。一种定量风险分析技术。通过考虑各种风险事件的概率及其可能带来的货币影响&#xff0c;来计算项目的预期价值。 可以用下面的较长进行表示&#xff1a; 水路的EMV:7000*3/4(7…...

C# 结构(Struct)

原文&#xff1a;C# 结构&#xff08;Struct&#xff09;_w3cschool 在 C# 中&#xff0c;结构是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构。 结构是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本…...

vim的.vimrc配置

使用背景 没想到有一天会用上这玩意。 有时候处于安全等考虑&#xff0c;服务器无法使用vscode直连&#xff0c;虽然大部分操作使用async利用云开发机同步即可&#xff0c;但是偶尔想要方便的修改远端服务器的代码&#xff0c;就可能临时使用vim&#xff0c;所以还是记录下自己…...

优化uniappx页面性能,处理页面滑动卡顿问题

问题&#xff1a;在页面遇到滑动特别卡的情况就是在页面使用了动态样式或者动态类&#xff0c;做切换的时候页面重新渲染导致页面滑动卡顿 解决&#xff1a;把动态样式和动态类做的样式切换改为通过获取元素修改样式属性值 循环修改样式示例 bannerList.forEach((_, index)…...

Qt5.15.2+OpenCV4.9.0开发环境搭建详细图文教程(OpenCV使用Qt自带MinGW编译的全过程,包教包会)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...

springboot在eclipse里面运行 run as 是Java Application还是 Maven

在 Eclipse 里运行 Spring Boot 项目时&#xff0c;既可以选择以“Java Application”方式运行&#xff0c;也可以通过 Maven 命令来运行&#xff0c;下面为你详细介绍这两种方式及适用场景。 以“Java Application”方式运行 操作步骤 在项目中找到带有 SpringBootApplicat…...

【Luogu】动态规划三

P3842 [TJOI2007] 线段 - 洛谷 思路&#xff1a; 5道题里就这道算比较有意思的一道dp 按照贪心的想法&#xff0c;每一次我们都最好是走完后到端点处再往下走 所以我们这里定义 dp[i][0/1] 为走完第 i 行且位于 左/右端点 那么对于左端点&#xff0c;其可从上一个左边点走…...

【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI

目录 Inspira UI 介绍 配置环境 使用示例 效果&#xff1a; Inspira UI 学习视频&#xff1a; 华丽优雅 | Inspira UI快速上手_哔哩哔哩_bilibili 官网&#xff1a;https://inspira-ui.com/ Inspira UI 介绍 Inspira UI 是一个设计精美、功能丰富的用户界面库&#xff0c;专为…...