第七十三篇 从电影院售票到停车场计数:生活场景解析Java原子类精髓
目录
- 一、原子类基础:电影院售票系统
- 1.1 传统售票的并发问题
- 1.2 原子类解决方案
- 二、原子类家族:超市收银系统
- 2.1 基础类型原子类
- 2.2 数组类型原子类
- 三、CAS机制深度解析:停车场管理系统
- 3.1 CAS工作原理
- 3.2 车位计数器实现
- 四、高性能实践:银行账户系统
- 4.1 账户余额更新
- 4.2 性能对比测试
- 五、原子类进阶:电影院选座系统
- 5.1 座位状态管理
- 5.2 批量更新优化
想象电影院售票处:多个窗口同时售票却不会售出重复座位;停车场入口自动计数系统实时更新车位状态——这正是Java原子类的完美生活映射。本文将用日常场景揭秘高并发环境下的无锁编程奥秘。
一、原子类基础:电影院售票系统
1.1 传统售票的并发问题
// 非原子操作导致超卖
public class TicketCounter {private int totalTickets = 100;public void sellTicket() {if(totalTickets > 0) {// 此处可能被其他线程中断totalTickets--; System.out.println("售出1张票,剩余:" + totalTickets);}}
}
1.2 原子类解决方案
public class AtomicTicketCounter {private final AtomicInteger tickets = new AtomicInteger(100);public void safeSellTicket() {int current;do {current = tickets.get();if(current <= 0) {System.out.println("票已售罄");return;}} while(!tickets.compareAndSet(current, current - 1));System.out.println("安全售出,剩余:" + tickets.get());}
}
二、原子类家族:超市收银系统
2.1 基础类型原子类
// 收银台计数器
AtomicLong dailySales = new AtomicLong(0); // 每笔交易更新
void processTransaction(double amount) {// 累加销售额dailySales.addAndGet((long)(amount * 100));// 更新最高单笔交易AtomicReference<Double> maxTransaction = new AtomicReference<>(0.0);maxTransaction.accumulateAndGet(amount, Math::max);
}
2.2 数组类型原子类
// 货架商品库存
AtomicIntegerArray shelfStock = new AtomicIntegerArray(10); // 补充第3号货架商品
void restockShelf(int shelfId, int quantity) {shelfStock.addAndGet(shelfId, quantity);
}// 顾客购买商品
boolean purchaseItem(int shelfId) {int current;do {current = shelfStock.get(shelfId);if(current <= 0) return false;} while(!shelfStock.compareAndSet(shelfId, current, current-1));return true;
}
三、CAS机制深度解析:停车场管理系统
3.1 CAS工作原理
3.2 车位计数器实现
public class ParkingLot {private final AtomicInteger availableSpots;private final int totalSpots;public ParkingLot(int capacity) {this.totalSpots = capacity;this.availableSpots = new AtomicInteger(capacity);}// 车辆进入public boolean carEnter() {int current;do {current = availableSpots.get();if(current <= 0) return false;} while(!availableSpots.compareAndSet(current, current - 1));updateDisplay();return true;}// 车辆离开public void carExit() {availableSpots.incrementAndGet();updateDisplay();}private void updateDisplay() {System.out.println("当前车位: " + availableSpots + "/" + totalSpots);}
}
四、高性能实践:银行账户系统
4.1 账户余额更新
public class BankAccount {private final AtomicLong balance;public BankAccount(long initial) {this.balance = new AtomicLong(initial);}// 无锁存款public void deposit(long amount) {balance.addAndGet(amount);}// 安全取款(避免透支)public boolean withdraw(long amount) {long current;do {current = balance.get();if(current < amount) return false;} while(!balance.compareAndSet(current, current - amount));return true;}// 转账操作public boolean transferTo(BankAccount target, long amount) {if(this.withdraw(amount)) {target.deposit(amount);return true;}return false;}
}
4.2 性能对比测试
操作方式 | 100万次操作耗时 | 适用场景 |
---|---|---|
synchronized | 450ms | 复杂事务处理 |
ReentrantLock | 380ms | 需要高级功能的场景 |
AtomicLong | 120ms | 简单计数器场景 |
五、原子类进阶:电影院选座系统
5.1 座位状态管理
public class SeatManager {// 使用AtomicReference数组管理座位状态private final AtomicReference<SeatStatus>[] seats;public SeatManager(int capacity) {seats = new AtomicReference[capacity];// 初始化所有座位为空闲Arrays.fill(seats, new AtomicReference<>(SeatStatus.AVAILABLE));}// 预订座位public boolean bookSeat(int seatId) {return seats[seatId].compareAndSet(SeatStatus.AVAILABLE, SeatStatus.OCCUPIED);}// 释放座位public void releaseSeat(int seatId) {seats[seatId].set(SeatStatus.AVAILABLE);}enum SeatStatus { AVAILABLE, OCCUPIED }
}
5.2 批量更新优化
// 使用LongAdder优化高频计数器
public class TicketCounter {private final LongAdder totalSales = new LongAdder();private final LongAdder vipSales = new LongAdder();public void sellTicket(boolean isVip) {totalSales.increment();if(isVip) vipSales.increment();}// 生成报表public void generateReport() {System.out.println("总售票: " + totalSales.sum());System.out.println("VIP票: " + vipSales.sum());}
}
🎯下期预告:《Java 并发容器》
💬互动话题:不深思则不能造于道。不深思而得者,其得易失
🏷️温馨提示:我是[随缘而动,随遇而安], 一个喜欢用生活案例讲技术的开发者。如果觉得有帮助,点赞关注不迷路🌟
相关文章:
第七十三篇 从电影院售票到停车场计数:生活场景解析Java原子类精髓
目录 一、原子类基础:电影院售票系统1.1 传统售票的并发问题1.2 原子类解决方案 二、原子类家族:超市收银系统2.1 基础类型原子类2.2 数组类型原子类 三、CAS机制深度解析:停车场管理系统3.1 CAS工作原理3.2 车位计数器实现 四、高性能实践&a…...

【原创】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
AI视频处理系统功能总览 🎯 系统概述 这是一个智能短视频自动化处理系统,专门用于视频搬运和二次创作。系统支持多赛道配置,可以根据不同的内容类型(如"外国人少系列"等)应用不同的处理策略。 Ἵ…...

C++----剖析list
前面学习了vector和string,接下来剖析stl中的list,在数据库中学习过,list逻辑上是连续的,但是存储中是分散的,这是与vector这种数组类型不同的地方。所以list中的元素设置为一个结构体,将list设计成双向的&…...

纳米AI搜索与百度AI搜、豆包的核心差异解析
一、技术定位与设计目标 1、纳米AI搜索:轻量化边缘计算导向 专注于实时数据处理与资源受限环境下的高效响应,通过算法优化和模型压缩技术,实现在物联网设备、智能终端等低功耗场景的本地化部署。其核心优势在于减少云端依赖,保障…...

不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!
一、OpenAI 用 Rust 重写 Codex CLI OpenAI 已用 Rust 语言重写了其 AI 命令行编程工具 Codex CLI,理由是此举能提升性能和安全性,同时避免对 Node.js 的依赖。他们认为 Node.js “可能让部分用户感到沮丧或成为使用障碍”。 Codex 是一款实验性编程代理…...
人工智能:网络安全的“智能守护者”
在数字化时代,网络安全已经成为企业和个人面临的重大挑战。随着网络攻击的复杂性和频率不断增加,传统的安全防护手段已经难以应对。人工智能(AI)技术的出现为网络安全带来了新的希望和解决方案。本文将探讨人工智能在网络安全中的…...

Python60日基础学习打卡Day46
一、 什么是注意力 注意力机制的由来本质是从onehot-elmo-selfattention-encoder-bert这就是一条不断提取特征的路。各有各的特点,也可以说由弱到强。 其中注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景&…...
综述论文解读:Editing Large Language Models: Problems, Methods, and Opportunities
论文为大语言模型知识编辑综述,发表于自然语言处理顶会ACL(原文链接)。由于目前存在广泛的模型编辑技术,但一个统一全面的分析评估方法,所以本文: 1、对LLM的编辑方法进行了详尽、公平的实证分析,探讨了它们各自的优势…...

WEB3全栈开发——面试专业技能点P1Node.js / Web3.js / Ethers.js
一、Node.js 事件循环 Node.js 的事件循环(Event Loop)是其异步编程的核心机制,它使得 Node.js 可以在单线程中实现非阻塞 I/O 操作。 🔁 简要原理 Node.js 是基于 libuv 实现的,它使用事件循环来处理非阻塞操作。事件…...

Vscode下Go语言环境配置
前言 本文介绍了vscode下Go语言开发环境的快速配置,为新手小白快速上手Go语言提供帮助。 1.下载官方Vscode 这步比较基础,已经安装好的同学可以直接快进到第二步 官方安装包地址:https://code.visualstudio.com/ 双击一直点击下一步即可,记…...
Java八股文——MySQL篇
文章目录 Java八股文——MySQL篇慢查询如何定位慢查询?如何分析慢SQLExplain标准答案 索引索引类型索引底层数据结构什么是聚簇索引什么是非聚簇索引?(二级索引)(回表)聚集索引选取规则回表查询 什么是覆盖…...
Oracle数据库学习笔记 - 创建、备份和恢复
Oracle数据库学习笔记 创建,备份和恢复 Oracle 版本基于11g 尽量不使用图形界面方式,操作适用于linux和windows 创建数据库 创建实例 # 步骤1:设置环境变量 export ORACLE_SIDmyorcl export ORACLE_HOME/u01/app/oracle/product/19.0.0/dbh…...

Go语言--语法基础5--基本数据类型--输入输出(1)
I : input 输入操作 格式化输入 scanf O : output 输出操作 格式化输出 printf 标准输入 》键盘设备 》 Stdin 标准输出 》显示器终端 》 Stdout 异常输出 》显示器终端 》 Stderr 1 、输入语句 Go 语言的标准输出流在打印到屏幕时有些参数跟别的语言…...

永磁同步电机无速度算法--自适应龙贝格观测器
一、原理介绍 传统龙伯格观测器,在设计观测器反馈增益矩阵K时,为简化分析与设计,根据静止两相坐标系下的对称关系,只引入了K、K,两个常系数,且在实际应用时,大多是通过试凑找到一组合适的反馈增益系数缺乏…...

LangChain工具集成实战:构建智能问答系统完整指南
导读:在人工智能快速发展的今天,如何构建一个既能理解自然语言又能调用外部工具的智能问答系统,成为许多开发者面临的核心挑战。本文将为您提供一套完整的解决方案,从LangChain内置工具包的基础架构到复杂系统的工程实践。 文章深…...

【razor】x264 在 的intra-refresh和IDR插帧
你提到的是这样一个情况: 使用 DirectShow 采集,帧率稳定(如回调了20帧)使用 x264 的 total intra refresh 模式(intra-refresh=1) 进行编码但编码过程中「隔几十秒才有一帧intra(关键帧)」这不正常,具体分析如下: 🎯 一、问题核心 x264 的 intra refresh 模式(特…...
分库分表的取舍
文章目录 大数据量下采用**水平分表**的缺点**1. 跨表查询复杂性与性能下降****2. 数据分布不均衡****3. 分布式事务与一致性问题****4. 扩展性受限****5. 查询条件限制与索引管理复杂****6. 数据迁移与维护成本高****7. 业务逻辑复杂度增加****总结** shardingJdbc分片策略**1…...

随机算法一文深度全解
随机算法一文深度全解 一、随机算法基础1.1 定义与核心特性1.2 算法优势与局限 二、随机算法经典案例2.1 随机化快速排序原理推导问题分析与策略代码实现(Python、Java、C) 2.2 蒙特卡罗方法计算 π 值原理推导问题分析与策略代码实现(Python…...

在 Conda 环境下配置 Jupyter Notebook 环境和工作目录
作为数据科学家或Python开发者,Jupyter Notebook 是我们日常工作的得力工具。本文将详细介绍如何在 Conda 环境中配置 Jupyter Notebook,包括环境设置和工作目录管理,帮助你打造高效的工作流程。 为什么要在 Conda 环境中使用 Jupyter Noteb…...

MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点
MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点 简述 MS39531 是一款正弦驱动的 三相无感直流电机驱动器 ,具有最小振动和高效率的特点。该驱动器内部集成了基本的闭环速度控制功能,能够根据特定的应用定制电…...

web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究
web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究 如何找到Defi中的交易机会 把defi看做是一个完全开放的金融产品图表,可以看到所有的一切东西;我们要沿着这些金融图表找到一些最优的路径,就…...

分析 java 的 Map<String,Map<String, List<Map<String,Integer>>>>
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;public class Test02 {public static void main(String[] args) {//分析方法:由外层向内层逐渐拆解要定义的变量。再由内向外进行变量赋值//外层第一层&#x…...

ChatterBox - 轻巧快速的语音克隆与文本转语音模型,支持情感控制 支持50系显卡 一键整合包下载
ChatterBox 是一个近期备受关注的开源语音克隆与文本转语音(TTS)模型,由 Resemble AI 推出,具备体积轻巧及超快的推理速度等特色。它也是首个支持情感夸张控制的开放源代码 TTS 模型,这一强大功能能让您的声音脱颖而出…...

前端开发面试题总结-HTML篇
文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…...

嵌入式学习--江协stm32day4
只能说拖延没有什么好结果,欠下的债总是要还的。 ADC 模拟信号转化为数字信号,例如温度传感器将外部温度的变化(模拟信号),转换为内部电压的变化(数字信号) IN是八路输入,下方是选择…...

【Matlab】连接SQL Server 全过程
文章目录 一、下载与安装1.1 SQL Server1.2 SSMS1.3 OLE DB 驱动程序 二、数据库配置2.1 SSMS2.2 SQL Server里面设置2.3 设置防火墙2.4 设置ODBC数据源 三、matlab 链接测试 一、下载与安装 微软的,所以直接去微软官方下载即可。 1.1 SQL Server 下载最免费的Ex…...
MS8551/MS8552/MS8554 单电源、轨到轨输入输出、高精度运放,可替代AD8551/AD8552/AD8554
MS8551/MS8552/MS8554 单电源、轨到轨输入输出、高精度运放,可替代AD8551/AD8552/AD8554 简述 MS8551/8552/8554 是轨到轨输入输出的高精度运算放大器,它有极低的输入失调电压和偏置电流,单电源电压范围为 1.8V 到 5V 。 MS8551/8552/85…...
什么是 Ansible 主机和组变量
Ansible 是一款强大的自动化工具,可简化配置管理、应用程序部署和预配等 IT 任务。其最有价值的功能之一是能够定义变量,从而为不同的主机和组定制剧本。本文将解释 Ansible 中组变量和主机变量的概念,并通过实际示例说明它们的用法。 Ansib…...
F#语言的区块链
F#语言在区块链中的应用 引言 区块链技术在过去十年中迅速崛起,成为了推动金融、供应链、物联网等多个领域创新的重要力量。近年来,随着区块链技术的普及,各种编程语言也纷纷被应用于区块链的开发中。F#语言作为一种功能性编程语言…...

9.RV1126-OPENCV 视频的膨胀和腐蚀
一.膨胀 1.视频流的膨胀流程 之前膨胀都是在图片中进行的,现在要在视频中进行也简单,大概思路就是:获取VI数据,然后把VI数据给Mat化发给VENC模块,然后VENC模块获取,这样就完成了。流程图: 2.代…...