多线程(线程安全)

news2025/4/25 6:14:17

一、线程安全的风险来源

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/等待机制
进程僵死死锁(互相等待资源)检测锁获取顺序是否一致

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

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

相关文章

开发了一个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、系统功能实现、代码编写、论文编写和辅导、论文…

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

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

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…

深入详解人工智能数学基础——概率论中的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…

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…

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

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

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

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

《求知导刊》是CN期刊吗?学术期刊吗?

《求知导刊》是CN 期刊&#xff0c;同时也属于学术期刊。 CN 期刊的定义 CN 期刊是指在我国境内注册、经国家新闻出版署批准公开发行的期刊&#xff0c;具备国内统一连续出版物号&#xff08;CN 号&#xff09;。这是判断期刊是否为正规合法期刊的重要标准。 《求知导刊》的 C…

动手试一试 Spring Security入门

1.创建Spring Boot项目 引入Web和Thymeleaf的依赖启动器 2.引入页面Html资源文件 在项目的resources下templates目录中&#xff0c;引入案例所需的资源文件&#xff08;下载地址&#xff09;&#xff0c;项目结构如下 3.创建控制器 Controller public class FilmController…

使用若依二次开发商城系统-4:商品属性

功能3&#xff1a;商品分类 功能2&#xff1a;商品品牌 功能1&#xff1a;搭建若依运行环境前言 商品属性功能类似若依自带的字典管理&#xff0c;分两步&#xff0c;先设置属性名&#xff0c;再设置对应的属性值。 一.操作步骤 1&#xff09;数据库表product_property和pro…

PCB封装主要组成元素

PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;封装是指将电子元件固定在 PCB 上&#xff0c;并实现电气连接的方式。主要包括以下几类。 1. 焊盘&#xff08;Pad&#xff09; 作用&#xff1a;焊盘是 PCB 封装中最重要的元素之一&#xff0c;它是…