多线程的经典案例(卖票)
前两天在站内看到几个多线程卖票的案例,发现代码都不怎么对,运行结果也不符合预期,不能有效复现多线程并发的场景。故而自己写了一套,过程中也产生了一些新的思考,在此梳理一下。
先贴代码,假设现在电影院有100张票,3个窗口同时售卖。
public class NewTask implements Runnable {public int num = 100;@Overridepublic void run() {while(num > 0) {try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}String name = Thread.currentThread().getName();System.out.println(name + "窗口正在卖" + num--);}}
}
这里有一个重点:就是使用sleep()模拟售票业务时间,如果不加,大概率不会出现并发问题,因为剩余代码所需执行时间极短,一个时间片内足以跑完。有兴趣的同学可以试试
测试类
public class Why {public static void main(String[] args) {NewTask newTask = new NewTask();Thread thread1 = new Thread(newTask, "1号");Thread thread2 = new Thread(newTask, "2号");Thread thread3 = new Thread(newTask, "3号");thread1.start();thread2.start();thread3.start();}
}
部分执行结果如下,同一张票被多个窗口卖出,成功复现了多线程并发问题,符合我们的预期。
至于解决并发无非就是加锁,保证访问共享资源的操作原子性。加锁方式很多,大家可以自行百度,这边我就贴个最简单的就是synchronized关键字。
public class NewTask implements Runnable {public int num = 100;@Overridepublic void run() {synchronized (NewTask.class) {while(num > 0) {try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}String name = Thread.currentThread().getName();System.out.println(name + "窗口正在卖" + num--);}}}
}
多线程的经典案例(卖票)相关推荐
- 线程安全问题经典案例---卖票
在入门多线程的时候,看到过不少的案例,其中卖票案例尤为经典,在这里自己也记录一下,同时加深对于线程安全的理解: 案例场景 情景一: 现在有一个电影院,马上要上映电影<战狼5>,电 ...
- 多线程经典问题 卖票问题
/** 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 思路: ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:pri ...
- 多线程并发问题 黄牛卖票和模拟龟兔赛跑问题分析
数据共享带来的并发问题 多线程有两个经典案例,12306买票问题和上厕所问题
- java多线程同步 多窗口卖票实例_java多线程之火车售票系统模拟实例
1.前言 为了学习多线程共享与通信,我们模拟一个火车售票系统,假设有10张火车票,三个窗口(也就是三个线程)同时进行售票. 2.非同步代码 package com.tl.skyLine.thread; ...
- DHV展示故事经典 案例 卖猪借宿
一男赶集卖猪,天黑遇雨,二十头猪(DHV展示)未卖成,到一农家借宿. SF说:家里只一人不便. (升起防护罩) 男:求你了大妹子,给猪一头. (类似假性时间限制解除防 ...
- java线程池售票_Java多线程卖票例子
以卖票的例子来介绍多线程和资源共享. 卖票是包含一系列动作的过程,有各种操作,例如查询票.收钱.数钱.出票等,其中有一个操作是每次卖掉一张,就将总的票数减去1.有10张票,如果一个人卖票,先做查票.收 ...
- 经典案例:卖票问题【线程同步】
一.案例需求 某个电影院上映了史诗级大片<回村的诱惑>,共有100张票,卖票窗口总共有三个.请设计一个程序模拟卖票的过程! 二.步骤分析 1.定义一个卖票的线程类实现Runnable接口, ...
- 卖票案例 多线程 java 1615387415
卖票案例 多线程 java 1615387415 解决 线程类 测试类 注意,需要给线程的类添加带参构造方法 在带参构造方法中 调一下父类的带参构造方法 最终结果 每个窗口都卖了一百张票
- 多线程:线程同步与死锁(卖票案例)、线程通信、生产者与消费者
卖票案例 5个窗口同时卖票: 使用Runnable接口,只创建了一个ticket1对象,5个线程共享此对象,实现了资源共享. public class ticket1 implements Runna ...
最新文章
- 非系统表空间损坏,rman备份恢复
- python与js通用的数据结构_五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)...
- 浅谈Python中的编码规则
- 【强化学习】DQN 的三种改进在运筹学中的应用
- 【Docker】 安装 nexus3
- 【第二组】项目冲刺(Beta版本)第一次每日例会 2017/7/18
- 《树莓派实战秘籍》——1.17 技巧17添加重启按钮
- Spring 定时任务的几种实现
- 能识别nvme的pe启动_【腾讯WeTest干货分享】机器学习在启动耗时测试中的应用及模型调优...
- Linux下修改Mysql的用户(root)的密码的俩种方法
- 图片怎样压缩到100KB以下?怎样压缩图片小于100KB?
- caj转换成word的方法,每天免费使用
- e路航LH900N导航仪凯立德最新版本地图更新方法
- c语言何钦铭,C语言 何钦铭
- Android应用优化之流畅度优化实操
- 上高职业技术学校计算机专科,上高县职业技术学校
- steam同乐无法连接远程计算机,Steam远程同乐功能怎么使用_Steam远程同乐功能使用方法_3DM单机...
- 计算机启动盘安装教程,笔记本系统重装教程,笔记本电脑u盘启动盘装系统教程...
- 人脸识别+深度学习,水平远超人类大脑!
- 从城市场景语义分割数据集中划分出自动驾驶领域道路分割数据集类别中遇到的问题
热门文章
- android 图片缩放,github开源库,PhotoView 使用
- marlin2.0 的使用过程记录。skr v1.3
- 网络 启动计算机,电脑设置网卡启动方法步骤
- 将本地电脑做外网映射
- 系统分析设计期末大项目——闲得一币TimeForCoin小程序前端
- Android事件分发-来龙去脉
- 杰奇1.7用php53,杰奇1.7小说系统多模版一库教程
- OAuth2.0微信code获取失败怎么办
- H3 BPM公文管理解决方案
- HDU 3629-Convex找凸四边形个数(扫描+二分/two pointers)