第七十篇 从餐厅后厨到电影院选座:生活场景拆解Java并发编程核心

news2025/6/3 1:27:15

目录

    • 一、并发基础:餐厅后厨的协作艺术
      • 1.1 厨师与线程(Thread)
      • 1.2 共享资源竞争:唯一的炒锅
      • 1.3 线程状态转换:厨师工作流
    • 二、线程同步:电影院选座中的锁机制
      • 2.1 同步锁(synchronized):选座系统
      • 2.2 显式锁(ReentrantLock):VIP选座通道
    • 三、线程协作:咖啡厅的点单取餐系统
      • 3.1 生产者-消费者模式
      • 3.2 CountDownLatch:旅行团集合点
    • 四、并发工具进阶:超市收银系统
      • 4.1 线程池(ExecutorService):收银通道管理
      • 4.2 ConcurrentHashMap:实时库存系统
    • 五、避坑指南:并发编程常见陷阱
      • 5.1 死锁场景:十字路口的四辆车
      • 5.2 线程饥饿:永远轮不到的普通会员
      • 5.3 内存可见性:过期的餐厅菜单
    • 六、性能优化:电影院排片策略
      • 6.1 锁粒度控制
      • 6.2 无锁编程:原子类操作
    • 结语:构建高效并发系统

想象一家繁忙的餐厅后厨:主厨指挥多个厨师同时处理订单,服务员在取餐口等待出菜,新订单不断涌入——这正是Java并发编程的完美生活映射。本文将用你熟悉的日常场景,带你掌握高并发系统的构建之道。

一、并发基础:餐厅后厨的协作艺术

1.1 厨师与线程(Thread)

每个厨师就像一个线程

// 厨师线程类
class ChefThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "开始烹饪");
        // 模拟烹饪耗时
        try { Thread.sleep(1000); } 
        catch (InterruptedException e) { e.printStackTrace(); }
    }
}

// 启动5个厨师线程
public static void main(String[] args) {
    for (int i=1; i<=5; i++) {
        new ChefThread().start();
    }
}

1.2 共享资源竞争:唯一的炒锅

当多个厨师争抢**同一个炒锅(共享资源)**时:

// 共享炒锅资源
class Wok {
    private boolean inUse = false;
    
    // 加锁使用炒锅
    public synchronized void use(String chefName) {
        if(inUse) return;
        inUse = true;
        System.out.println(chefName + "占用炒锅");
    }
}

1.3 线程状态转换:厨师工作流

线程状态厨师状态触发条件
RUNNABLE正在切菜获取到食材
BLOCKED等待炒锅其他厨师占用炒锅
WAITING等待服务员传菜菜品完成但服务员未就位
TIMED_WAITING定时查看烤箱设置定时器监控烘焙进度

二、线程同步:电影院选座中的锁机制

2.1 同步锁(synchronized):选座系统

场景:多人同时在线选座,避免座位重复出售

class Cinema {
    private boolean[] seats = new boolean[100]; // 100个座位
    
    // 同步选座方法
    public synchronized boolean bookSeat(int seatNo) {
        if(!seats[seatNo]) {
            seats[seatNo] = true;
            System.out.println(Thread.currentThread().getName() 
                            + "成功预订座位" + seatNo);
            return true;
        }
        return false;
    }
}

2.2 显式锁(ReentrantLock):VIP选座通道

场景:提供超时等待功能,避免无限期阻塞

private ReentrantLock lock = new ReentrantLock();

public boolean vipBookSeat(int seatNo) {
    try {
        // 尝试在1秒内获取锁
        if(lock.tryLock(1, TimeUnit.SECONDS)) {
            if(!seats[seatNo]) {
                seats[seatNo] = true;
                return true;
            }
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        if(lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
    return false;
}

三、线程协作:咖啡厅的点单取餐系统

3.1 生产者-消费者模式

场景:顾客(生产者)下单,咖啡师(消费者)制作

BlockingQueue<Order> orderQueue = new ArrayBlockingQueue<>(10);

// 顾客下单
class Customer implements Runnable {
    public void run() {
        orderQueue.put(new Order()); // 队列满时阻塞
    }
}

// 咖啡师制作
class Barista implements Runnable {
    public void run() {
        while(true) {
            Order order = orderQueue.take(); // 队列空时阻塞
            makeCoffee(order);
        }
    }
}

3.2 CountDownLatch:旅行团集合点

场景:导游等待所有游客到齐才发车

CountDownLatch latch = new CountDownLatch(10); // 10人旅行团

// 游客线程
class Tourist extends Thread {
    public void run() {
        System.out.println(getName() + "到达集合点");
        latch.countDown();
    }
}

// 导游线程
class Guide extends Thread {
    public void run() {
        latch.await(); // 等待所有游客
        System.out.println("所有游客到齐,发车!");
    }
}

四、并发工具进阶:超市收银系统

4.1 线程池(ExecutorService):收银通道管理

// 开放4个收银通道
ExecutorService cashiers = Executors.newFixedThreadPool(4); 

// 顾客排队结账
for(int i=0; i<20; i++) {
    cashiers.execute(() -> {
        System.out.println("顾客在"+Thread.currentThread().getName()+"结账");
    });
}

cashiers.shutdown(); // 营业结束关闭收银台

4.2 ConcurrentHashMap:实时库存系统

ConcurrentHashMap<String, Integer> inventory = 
    new ConcurrentHashMap<>();

// 多个收银台同时更新库存
inventory.compute("可乐", (k, v) -> v == null ? -1 : v-1);

五、避坑指南:并发编程常见陷阱

5.1 死锁场景:十字路口的四辆车

条件:四个方向的车都等待对方先通行
解决方案:规定通行优先级(锁排序)

5.2 线程饥饿:永远轮不到的普通会员

现象:VIP会员总是优先办理业务
修复:使用公平锁(Fair Lock)

5.3 内存可见性:过期的餐厅菜单

// 错误示例:其他线程可能看不到menuChanged更新
boolean menuChanged = false; 

// 正确做法:使用volatile保证可见性
volatile boolean menuChanged = true;

六、性能优化:电影院排片策略

6.1 锁粒度控制

// 粗粒度锁:锁整个影厅(性能差)
public synchronized void bookSeats(List<Integer> seats) {...}

// 细粒度锁:只锁选定座位(推荐)
public void bookSeats(List<Integer> seats) {
    for (int seat : seats) {
        synchronized (seatLocks[seat]) {
            // 处理单个座位
        }
    }
}

6.2 无锁编程:原子类操作

AtomicInteger availableTickets = new AtomicInteger(100);

// 多个窗口同时售票
public boolean sellTicket() {
    int current = availableTickets.get();
    if(current > 0) {
        return availableTickets.compareAndSet(current, current-1);
    }
    return false;
}

结语:构建高效并发系统

Java并发编程如同管理繁忙的餐厅后厨:

  1. 合理分工:使用线程池控制工作线程数量
  2. 资源协调:通过锁机制避免资源冲突
  3. 流程优化:利用阻塞队列实现生产者-消费者模式
  4. 实时同步:采用原子操作保证数据一致性
新订单
订单队列
线程池
厨师线程1
厨师线程2
厨师线程3
完成菜品
出餐口

掌握这些生活化的并发模式,你将能构建出如米其林餐厅后厨般高效运转的Java应用系统。记住:优秀的并发程序不是没有锁,而是让线程排队时间最小化,协作效率最大化

🎯下期预告:《Java 线程池》
💬互动话题:第一要有志,第二要有识,第三要有恒
🏷️温馨提示:我是[随缘而动,随遇而安], 一个喜欢用生活案例讲技术的开发者。如果觉得有帮助,点赞关注不迷路🌟

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

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

相关文章

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.11 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.11 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe<-data.frame( densityc(570,565,…

《软件工程》实战— 在线教育平台开发

一、项目概述 1.1 项目背景与目标 随着教育数字化转型加速&#xff0c;传统教育模式逐渐向线上迁移&#xff0c;教育机构急需一个支持多终端访问、实时互动及高并发场景稳定运行的在线教育平台。本项目旨在构建学生、教师、管理员三位一体的协作教学环境&#xff0c;实现 50-2…

iOS 使用CocoaPods 添加Alamofire 提示错误的问题

Sandbox: rsync(59817) deny(1) file-write-create /Users/aaa/Library/Developer/Xcode/DerivedData/myApp-bpwnzikesjzmbadkbokxllvexrrl/Build/Products/Debug-iphoneos/myApp.app/Frameworks/Alamofire.framework/Alamofire.bundle把这个改成 no 2 设置配置文件

Python打卡训练营学习记录Day41

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 →…

C++深入类与对象

在上一篇中提到了构造函数&#xff0c;那么这篇再来提一下构造函数&#xff0c;编译器自动生成的默认构造函数对于内置类型不做处理&#xff0c;自定义类型会调用它自己的构造函数。对于自己写的构造函数&#xff0c;之前是在函数体中初始化&#xff0c;当然不止这一种初始化&a…

阿里云服务器邮件发送失败(dail tcp xxxx:25: i/o timeout)因为阿里云默认禁用 25 端口

最近在测试发送邮件的功能&#xff0c;发现了一个奇怪的问题&#xff0c;同样的 docker 镜像&#xff0c;在本地跑起来是可以正常发送邮件的&#xff0c;但是在阿里云的服务器上跑&#xff0c;就会报错 i/o timeout。 排查了一圈发现&#xff0c;原来是阿里云的操作&#xff0…

力扣HOT100之动态规划:322. 零钱兑换

这道题和上一道题279.完全平方数的套路是完全一样的&#xff0c;但是这道题不需要我们自己生成物品列表&#xff0c;函数的输入中已经给出了&#xff0c;但是这道题有一个坑&#xff0c;就是我们在初始化dp数组的时候&#xff0c;所有的位置不应该赋值为INT_MAX&#xff0c;因为…

电商售后服务系统与其他系统集成:实现售后流程自动化

在竞争激烈的电商市场中&#xff0c;优质的售后服务对于提升用户满意度和忠诚度至关重要。然而&#xff0c;售后服务流程通常涉及多个环节和系统&#xff0c;如何高效地管理这些流程&#xff0c;减少人工干预&#xff0c;提升服务效率&#xff0c;是电商企业亟待解决的问题。电…

kafka学习笔记(三、消费者Consumer使用教程——消费性能多线程提升思考)

1.简介 KafkaConsumer是非线程安全的&#xff0c;它定义了一个acquire()方法来检测当前是否只有一个线程在操作&#xff0c;如不是则会抛出ConcurrentModifcationException异常。 acquire()可以看做是一个轻量级锁&#xff0c;它仅通过线程操作计数标记的方式来检测线程是否发…

[JVM] JVM内存调优

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

秒出PPT正式改名秒出AI,开启AI赋能新体验!

在现代办公环境中&#xff0c;借助智能工具提升工作效率已经成为趋势。秒出AI作为一款集AI PPT制作、动画、巨幕、视频、设计以及智能简历功能于一体的综合办公平台&#xff0c;为用户提供一站式智能内容生成解决方案&#xff0c;极大地简化了内容创作流程。 1. AI驱动的一键P…

VM改MAC电脑密码(截图)

进入恢复模式重置密码 重启mac并同时按下CommandR&#xff0c;进入恢复模式。进入「菜单栏-实用程序-终端」&#xff0c;输入命令「resetpassword」回车运行&#xff0c;调出密码重置工具。选择包含密码的启动磁盘卷宗、需重设密码的用户账户&#xff1b;输入并确认新的用户密…

SpringBoot+Vue+微信小程序校园自助打印系统

概述​​ 校园自助打印系统是现代化校园建设中不可或缺的一部分&#xff0c;基于SpringBootVue微信小程序开发的​​免费Java源码​​项目&#xff0c;包含完整的用户预约、打印店管理等功能模块。 ​​主要内容​​ ​​ 系统功能模块​​ ​​登录验证模块​​&#xff1a;…

【论文精读】2024 CVPR--Upscale-A-Video现实世界视频超分辨率(RealWorld VSR)

文章目录 一、摘要二、挑战三、Method3.1 前置知识3.1.1 预训练SD 4 Upscaler3.1.2 Inflated 2D Convolution 扩展2D卷积 3.2 Local Consistency within Video Segments 视频片段中的一致性3.2.1 微调时序U-Net3.2.2 微调时序VAE-Decoder 3.3 跨片段的全局一致性 Global Consis…

学术合作交流

想找志同道合的科研小伙伴&#xff01;研究方向包括&#xff1a;计算机视觉&#xff08;CV&#xff09;、人工智能&#xff08;AI&#xff09;、目标检测、行人重识别、行人搜索、虹膜识别等。欢迎具备扎实基础的本科、硕士及博士生加入&#xff0c;共同致力于高质量 SCI 期刊和…

【LUT技术专题】图像自适应3DLUT

3DLUT开山之作: Learning Image-adaptive 3D Lookup Tables for High Performance Photo Enhancement in Real-time&#xff08;2020 TPAMI &#xff09; 专题介绍一、研究背景二、图像自适应3DLUT方法2.1 前置知识2.2 整体流程2.3 损失函数的设计 三、实验结果四、局限五、总结…

德拜温度热容推导

目录 一、背景与基本假设 一、态密度的定义 二、从波矢空间出发 三、振动模式数与波矢体积关系 四、模式总数计算 五、态密度求导 六、德拜频率确定与归一化条件 二、内能表达式的推导 三、态密度代入与变量替换 四、求比热容 五、低温时&#xff08;&#xff09; …

【iOS】源码阅读(五)——类类的结构分析

文章目录 前言类的分析类的本质objc_class 、objc_object和NSObjectobjc_object&#xff1a;所有对象的基类型objc_class&#xff1a;类的底层结构NSObject&#xff1a;面向用户的根类 小结 指针内存偏移普通指针----值拷贝对象----指针拷贝或引用拷贝用数组指针引出----内存偏…

基于CangjieMagic的RAG技术赋能智能问答系统

目录 引言 示例程序分析 代码结构剖析 导入模块解读 智能体配置详情 提示词模板说明 主程序功能解析 异步聊天功能实现 检索信息展示 技术要点总结 ollama 本地部署nomic-embed-text 运行测试 结语 引言 这段时间一直在学习CangjieMagic。前几天完成了在CangjieMa…

算力租赁革命:弹性模式如何重构数字时代的创新门槛​

一、算力革命&#xff1a;第四次工业革命的核心驱动力​ 在科技飞速发展的当下&#xff0c;我们正悄然迎来第四次工业革命。华为创始人任正非在一场程序设计竞赛中曾深刻指出&#xff0c;这场革命的基础便是大算力。随着 5G、人工智能、大数据、物联网等信息技术的迅猛发展&am…