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

多线程卖票问题

多线程卖票问题

一、问题

假设共有固定数量的车票,开启多个线程模拟多个售票窗口同时售票,如果不做特殊处理,会出现同一张票被多次卖出、票数超卖的异常情况。

二、线程基础概念

线程是进程的运行子分支,同一个进程内的多个线程会共享进程中的数据。

线程安全问题的根源:比如多个线程同时修改同一份共享数据时,操作过程可能被 CPU 打断,最终导致数据结果出现问题。

三、创建线程的两种方式

方式 1:继承 Thread 类

自定义类继承 Thread 类

重写 run() 方法,编写线程要执行的业务逻辑

创建自定义类对象,调用 start() 方法启动线程

方式 2:实现 Runnable 接口

自定义类实现 Runnable 接口

重写 run() 方法,编写线程执行逻辑

将自定义类的对象传入 Thread 类的构造方法

调用 Thread 对象的 start() 方法启动线程

四、线程内存模型

堆内存:所有线程共享,静态变量、共享数据都存储在这里,比如总票数 count。

栈内存:每个线程私有,存放线程自己的局部变量。

线程操作共享数据时,会先把数据复制到自己的本地变量副本中,修改完成后再写回共享内存。普通的数值增减不是原子操作(执行中途可以被 CPU 打断),因此多线程同时操作就会出现数据错误。

线程内存模型示意图:

JVM

栈内存(线程私有)

堆内存(线程间共享)

线程 B

线程 A

count 副本

count

count 副本

副本--

副本--

五、线程安全解决方案:synchronized 内置锁

作用

将一段代码包裹起来,保证同一时刻只有一个线程能执行这段代码,让操作变成不可打断的原子操作。尽可能避免出现比如同一张票被多次卖出、票数超卖的异常情况

语法


java
synchronized(锁对象) {
// 需要保证原子性的核心代码
}


注意点

锁对象必须是所有线程都能访问到的同一个对象,通常用静态对象充当全局锁。

锁的粒度要尽量小,只包裹核心的共享数据操作代码;锁的范围太大,会导致其他线程长时间等待,降低程序运行效率。

线程进入同步代码块时自动获取锁,代码执行完毕后自动释放锁。

六、卖票代码核心逻辑

定义静态的总票数 count 和锁对象 obj,保证所有线程共享同一份数据和锁。

每个售票线程循环售票,在修改票数前加锁,并且加锁后再次判断票数是否大于 0,防止超卖。

减票操作完成后再输出售票信息,保证输出的数据准确。

小结

卖票问题的核心是多线程共享数据的安全问题,通过 synchronized 内置锁可以保证售票操作的原子性,有效避免超卖、重复售票的异常。

http://www.jsqmd.com/news/1170302/

相关文章:

  • 2026环氧板品牌推荐重磅更新,浙江亚格电子稳居行业前列,质量好头部品牌值得信赖 - 品牌速递
  • pyuadk实战:10个SM3哈希与HMAC操作示例
  • 2026年7月最新泰州真力时官方售后客服服务电话及地址网点大全 - 亨得利官方服务中心
  • 网络入门:VLAN 到底是什么?一文读懂虚拟局域网
  • 【在trae中构建和调试Qt程序Hello World】
  • 如何辨别正规GEO服务商 避坑指南:正规vs黑帽识别信号与资质核查全流程 - GEO优化
  • 百达翡丽中国官方售后服务中心|服务热线及门店详细地址权威信息通告(2026年7月最新) - 百达翡丽服务中心
  • Unity3D学习资源鉴别指南:从PDF陷阱到高效学习路径规划
  • AI自我改进与驾驭工程:构建可控的智能进化系统
  • 京东抢购助手:3步轻松实现自动抢购,告别手速慢的烦恼!
  • 2026 年新发布:红桥值得关注的涵洞撬毛台车制造商哪家可靠,揭秘:这个“小工具”如何颠覆你的毛线整理效率? - 企业官方推荐【认证】
  • 绝缘螺杆在电力行业应用,浙江亚格电子质量稳定,品牌推荐一致好评 - 品牌速递
  • Bash Shell 结构化命令
  • 虚拟手柄革命:如何用vJoy将键盘鼠标变身专业游戏控制器
  • 【回眸】搞钱灵感——网红餐厅代排平台核心应用场景与落地方案
  • AI舞蹈生成技术解析:从扩散模型到Luma平台实战应用
  • windterm2.5.0中打开vim显示 ESC问题
  • 2026年7月最新南京浪琴官方售后服务网点地址及客服电话一览 - 浪琴官方售后服务中心
  • 膜结构球场适合举办哪些活动?
  • ChatGPT响应太慢怎么办?立即执行这9项检查清单(含curl诊断脚本+Prometheus监控模板,附赠GitHub仓库)
  • STM32F745ZG与DTH-08模块的GPIO信号优化实践
  • AM2910 微程序定序器深度解析:在 TEC-2 中实现 3 种微程序流控制
  • 绝缘螺杆制造工艺革新,浙江亚格电子品质靠谱,厂家推荐排名领先 - 品牌速递
  • 工业负载控制方案:TPD2017FN与PIC18F96J94应用解析
  • Unity多版本共存:高效管理开发环境,提升项目稳定性与效率
  • Linux 与 HDFS 操作效率对比:10 个常见场景下的 Shell 命令与 Web UI 操作指南
  • Function Calling 超时策略:别让一个慢工具拖垮整个 Agent 响应
  • PS去水印不模糊原图方法是什么?去除豆包水印实操教学
  • 2026年武汉汽车改装推荐指南 | 15年豪华车改装头部品牌,新能源升级性价比之王 - 前沿观察站
  • AssetStudio深度解析:Unity资源提取原理与实战指南