第七十篇 从餐厅后厨到电影院选座:生活场景拆解Java并发编程核心
目录
- 一、并发基础:餐厅后厨的协作艺术
- 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 {@Overridepublic 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并发编程如同管理繁忙的餐厅后厨:
- 合理分工:使用线程池控制工作线程数量
- 资源协调:通过锁机制避免资源冲突
- 流程优化:利用阻塞队列实现生产者-消费者模式
- 实时同步:采用原子操作保证数据一致性
掌握这些生活化的并发模式,你将能构建出如米其林餐厅后厨般高效运转的Java应用系统。记住:优秀的并发程序不是没有锁,而是让线程排队时间最小化,协作效率最大化。
🎯下期预告:《Java 线程池》
💬互动话题:第一要有志,第二要有识,第三要有恒
🏷️温馨提示:我是[随缘而动,随遇而安], 一个喜欢用生活案例讲技术的开发者。如果觉得有帮助,点赞关注不迷路🌟
相关文章:
第七十篇 从餐厅后厨到电影院选座:生活场景拆解Java并发编程核心
目录 一、并发基础:餐厅后厨的协作艺术1.1 厨师与线程(Thread)1.2 共享资源竞争:唯一的炒锅1.3 线程状态转换:厨师工作流 二、线程同步:电影院选座中的锁机制2.1 同步锁(synchronized࿰…...
深入理解设计模式之代理模式
深入理解设计模式之:代理模式 一、什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式。它为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标…...
8位单通道数据保存为JPG
如何将单通道8位灰度数据(0黑~255白)直接保存为JPG文件? 这里提供两种最实用方案:轻量级STB库(推荐)和OpenCV方案(已有环境适用) STB方案 - 推荐 //https://github.com/nothings/…...
【Java实战】低侵入的线程池值传递
欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录 引言InheritableThreadLocalAlibaba Transmittab…...

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.11 R语言解题
本文是实验设计与分析(第6版,Montgomery著,傅珏生译) 第5章析因设计引导5.7节思考题5.11 R语言解题。主要涉及方差分析,正态假设检验,残差分析,交互作用图。 dataframe<-data.frame( densityc(570,565,…...
c++复习_第一天(引用+小众考点)
https://en.cppreference.com/w/cpp/io/manip 参考一下,这一部分比较基础,所以就一遍过 eg1:转16进制 #include<iostream> #include<iomanip> using namespace std;int main() {int n;cout << "请输入一个整数:";cin >> n;cou…...

《软件工程》实战— 在线教育平台开发
一、项目概述 1.1 项目背景与目标 随着教育数字化转型加速,传统教育模式逐渐向线上迁移,教育机构急需一个支持多终端访问、实时互动及高并发场景稳定运行的在线教育平台。本项目旨在构建学生、教师、管理员三位一体的协作教学环境,实现 50-2…...
Unity中的JsonManager
1.具体代码 先贴代码 using LitJson; using System.IO; using UnityEngine;/// <summary> /// 序列化和反序列化Json时 使用的是哪种方案 有两种 JsonUtility 不能直接序列化字典 ligJson可以序列化字典 /// </summary> public enum JsonType {JsonUtilit…...
《AI大模型的开源与性能优化:DeepSeek R1的启示》
以下是一篇基于今日新闻的技术博客文章: 在AI大模型领域,开源与性能优化一直是推动技术进步的关键因素。2025年5月28日,DeepSeek开源了其R1最新0528版本,这一事件不仅引发了行业关注,也为我们提供了深入探讨AI大模型技…...
Java-代码段-http接口调用自身服务中的其他http接口(mock)-并建立socket连接发送和接收报文实例
最新版本更新 https://code.jiangjiesheng.cn/article/367?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. controller入口 ApiOperation("模拟平台端现场机socket交互过程,需要Authorization")PostMapping(path "/testS…...

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归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 →…...
单链表反序实现
这个算法题有两种实现方式,一种是迭代,就是循环,还有一种是递归实现 迭代实现 迭代实现原理上是在一个循环如for中依次将一个节点的方向改变达到原地反序的实现 迭代法的核心是使用三个指针(prev, curr, next)逐个…...

C++深入类与对象
在上一篇中提到了构造函数,那么这篇再来提一下构造函数,编译器自动生成的默认构造函数对于内置类型不做处理,自定义类型会调用它自己的构造函数。对于自己写的构造函数,之前是在函数体中初始化,当然不止这一种初始化&a…...
机器学习算法04:SVC 算法(向量机分类)
目录 一、算法核心特点 二、使用场景 三、代码示例(以 Python 的 scikit - learn 库为例) 四、与其他分类算法对比 SVC 即 Support Vector Classification,是支持向量机(SVM)在分类任务中的具体实现。在你正在阅读…...
Fragment事务commit与commitNow区别
在 Android 的 Fragment 事务处理中,commit() 和 commitNow() 是两种提交事务的方式,它们的区别主要体现在执行时机、事务顺序和兼容性等方面。以下是它们的核心区别: 1. 执行时机 commit() 将事务异步加入主线程的待执行队列。不会立即执行&…...
LVS-DR高可用-Keepalived
目录 Keepalved双机热备 核心概念 关键组件 工作流程 实例环境 配置keepalived Web服务器配置 Keepalved双机热备 Keepalived双机热备是一种基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)实现的高可用性解决方案&am…...

阿里云服务器邮件发送失败(dail tcp xxxx:25: i/o timeout)因为阿里云默认禁用 25 端口
最近在测试发送邮件的功能,发现了一个奇怪的问题,同样的 docker 镜像,在本地跑起来是可以正常发送邮件的,但是在阿里云的服务器上跑,就会报错 i/o timeout。 排查了一圈发现,原来是阿里云的操作࿰…...

力扣HOT100之动态规划:322. 零钱兑换
这道题和上一道题279.完全平方数的套路是完全一样的,但是这道题不需要我们自己生成物品列表,函数的输入中已经给出了,但是这道题有一个坑,就是我们在初始化dp数组的时候,所有的位置不应该赋值为INT_MAX,因为…...

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

kafka学习笔记(三、消费者Consumer使用教程——消费性能多线程提升思考)
1.简介 KafkaConsumer是非线程安全的,它定义了一个acquire()方法来检测当前是否只有一个线程在操作,如不是则会抛出ConcurrentModifcationException异常。 acquire()可以看做是一个轻量级锁,它仅通过线程操作计数标记的方式来检测线程是否发…...
mongodb删除字段
删除普通字段 db.table.updateManay({}, {"$unset":{"要删除的字段": 1}})删除EmbeddedDocument字段 db.table.updateManay({}, {"$unset":{"models.name": 1}})models是个列表也可以这样删除字段 数据示例: { "m…...

[JVM] JVM内存调优
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
Liunx部署ES单机集群
ES 7.17.26 为例 一、单机 下载ES安装包 下载地址 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.26-linux-x86_64.tar.gz wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.26-linux-x86_64.tar.gz.sha512…...

秒出PPT正式改名秒出AI,开启AI赋能新体验!
在现代办公环境中,借助智能工具提升工作效率已经成为趋势。秒出AI作为一款集AI PPT制作、动画、巨幕、视频、设计以及智能简历功能于一体的综合办公平台,为用户提供一站式智能内容生成解决方案,极大地简化了内容创作流程。 1. AI驱动的一键P…...
Unity中的AudioManager
1.先贴代码 using UnityEngine; using System.Collections.Generic; using System.Collections; using UnityEngine.SceneManagement;public class AudioManager : MonoSingleton<AudioManager> {[Header("Audio Settings")][SerializeField] private int ini…...

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

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

【论文精读】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…...

学术合作交流
想找志同道合的科研小伙伴!研究方向包括:计算机视觉(CV)、人工智能(AI)、目标检测、行人重识别、行人搜索、虹膜识别等。欢迎具备扎实基础的本科、硕士及博士生加入,共同致力于高质量 SCI 期刊和…...