多线程编写12306售票系统
首先我们需要先创建线程对象,假设只有10张票,模拟三个售票窗口,然后三个窗口同时售票(启动线程)
public class Ticket {public static void main(String[] args) {Window window = new Window();//创建线程对象Thread t1 = new Thread(window);Thread t2 = new Thread(window);Thread t3 = new Thread(window);t1.setName("一号窗口");t2.setName("二号窗口");t3.setName("三号窗口");//启动线程t1.start();t2.start();t3.start();}
}class Window implements Runnable{//定义车票数private int ticket = 10;@Overridepublic void run() {while(true){if (ticket > 0){System.out.println("还剩:" + ticket + "张票");ticket--;System.out.println(Thread.currentThread().getName() + "卖出一张票,还剩" + ticket + "张票");}else{System.out.println("对不起,票已售空");break;}}}
}
经过运行可以发现这三个线程会同时进行访问车票,会造成非线程安全问题
还剩:2张票
三号窗口卖出一张票,还剩1张票
还剩:1张票
三号窗口卖出一张票,还剩0张票
对不起,票已售空
还剩:10张票
一号窗口卖出一张票,还剩9张票
对不起,票已售空
二号窗口卖出一张票,还剩-1张票
对不起,票已售空
会造成ticket < 0的情况,因为三个线程共享一个车票数量,每次购票必须进行“排队”购票,也就是说,在t1线程进入执行时,遇到synchronized,这个时候自动找”后面共享对象“的对象锁, 找到之后,并占有这把锁,然后执行同步代码块中的程序,在程序执行过程中一直都是占有这把锁的, 直到同步代码块代码结束,这把锁才会释放,所以不会与后面的窗口进行抢夺,这样就达到了线程排队执行。
进行线程同步机制,使用 synchronized()可以使线程安全
while(true) {synchronized (this) {if (ticket > 0) {
在线程代码块中进行”对象锁“,此时的this对象就是Window,三个线程共享一个资源,所以这里推荐使用this(这里需要注意的是:这个共享对象一定要选好,这个共享对象一定是你需要排队执行的 这些线程对象所共享的)
进行修改后
还剩:10张票
一号窗口卖出一张票,还剩9张票
还剩:9张票
一号窗口卖出一张票,还剩8张票
还剩:8张票
一号窗口卖出一张票,还剩7张票
还剩:7张票
一号窗口卖出一张票,还剩6张票
还剩:6张票
一号窗口卖出一张票,还剩5张票
还剩:5张票
一号窗口卖出一张票,还剩4张票
还剩:4张票
一号窗口卖出一张票,还剩3张票
还剩:3张票
一号窗口卖出一张票,还剩2张票
还剩:2张票
一号窗口卖出一张票,还剩1张票
还剩:1张票
一号窗口卖出一张票,还剩0张票
对不起,票已售空
对不起,票已售空
对不起,票已售空
只有当第一个线程结束后,第二个线程才会执行代码,所以保证了数据的安全,放弃了运行效率。但是效率面前,安全是第一位的,所以希望大家在今后的代码编写中要注意代码的线程安全
对于synchronized语法,我进行了总结两种使用方法:
第一种:同步代码块
比较灵活
synchronized(线程共享对象){
同步代码块;
}
第二种:在实例方法上使用synchronized
表示共享对象一定是this
并且同步代码块是整个方法体
ps:初出茅庐,请多指点!
多线程编写12306售票系统相关推荐
- python线程创建对象_Python使用面向对象方式创建线程实现12306售票系统
目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更 ...
- Java售票方式_Java多线程之火车售票系统
Java多线程之火车售票(Thread和Runnable的区别) java中实现多线程的方式有两种 继承Thread类 实现Runnable接口 继承了Thread类的类,使用对象.start()启动 ...
- linux多线程编写哲学家,Linux系统编程(三) ------ 多线程编程
一.线程的创建和调度 1.线程是程序执行的某一条指令流的映像. 为了进一步减少处理机制的空转时间,支持多处理器及减少上下文切换开销,进程在演化中出现了另一个概念--线程.它是进程内独立的一条运行路线, ...
- Java多线程模拟售票系统
Java创建多线程的两种基本方法: 方法1.继承Thread类 (1)定义子类,继承Thread类,重写该类的run()方法作为线程执行体; (2)创建该子类的实例作为线程对象; (3)调用线程对象的 ...
- 铁路售票系统_铁路资讯:复兴号动车、智能京张高铁…中国最高端铁路装备看这里...
今天上午,两年一度的中国国际现代化铁路技术装备展在京开展,会期3天,将集中展示路网建设.客货运输.经营管理.工程建造.技术装备.旅客服务等铁路行业各领域的先进产品及技术. 展会现场 智能京张:将首次实 ...
- Java多线程案例:模拟12306火车站售票系统
Java多线程案例:模拟12306火车站售票系统 该系统一共涉及到3个类: 车票(Ticket) 12306系统(System12306) 售票窗口(Window) 车票类,涉及三个属性: 起始站 终 ...
- 运用多线程知识写一个火车站售票系统
题目简介: 在现实世界中有一种数据模型,模拟生产者与消费者模型.如火车票售票系统,将票据的数量录入服务器我们称之为"生产"了若干车票.各地终端会共享这些车票信息去售票.直到车票售票 ...
- 利用JAVA多线程模拟售票系统,对统一资源进行处理
首先多线程处理统一资源的方式有两种 分别介绍一下两者的区别 synchronized与Lock的区别 1.Lock不是Java语言内置的,synchronized是Java语言的关键字 2.synch ...
- 火车售票系统c语言编程,基于C语言实现简单的12306火车售票系统.pdf
基基于于C语语言言实实现现简简单单的的12306火火车车售售票票系系统统 程序设计要求用C语言写一个简单的火车售票系统,主要实现的功能为: 入班次信息 浏览班次信息 按班次号查询 按终点站查询 按余票 ...
最新文章
- mysql查看数据文件ibdata_如何从 ibdata文件 恢复 MySQL 数据库
- linux命令详解:md5sum命令
- node.js JS对象和JSON字符串之间的转换
- 【华为敏捷/DevOps实践】6.架构师在新兴的DevOps组织应该扮演什么样的角色?
- epoll示例程序——服务端
- Kubernetes详解(十七)——Pod存活性探针应用实战
- 智能优化算法:适应度相关优化算法 - 附代码
- wps分析工具库如何加载_怎么在wps表格里面加入“数据分析”工具啊?
- mapgis转arcgis
- c盘存放文件夹的功能
- jflash烧录教程_Flash基础入门之J-Link固件烧录以及使用J-Flash向arm硬件板下载固件程序...
- pycharm主题背景图片设置,让你的界面酷起来!
- Found existing installation:xxxx
- travis ci java_Travis CI使用经验
- Linux系统的优点小结
- 如何解决MathPage.wll文件找不到问题
- 自己写一个strcmp函数(C++)
- 微信小程序 关于下载文件、打开文件预览文件(wx.downloadFile和wx.openDocument)
- 基于JPVideoPlayerKit的小视频播放
- 知乎网的CSS命名规律研究
热门文章
- 少吃调料竟然是错的!这9种调料原来是长寿高手
- 修改WINVER、_WIN32_WINNT和_MSC_VER
- 非主流闪图头像教程:扩散粒子效果
- 入门SAP MM的学习流程
- CSP 寻宝!大冒险! C++
- 交叉编译lrzsz(用于串口传输文件)
- 狗哥历经四个小时整理大佬的内容,你确定不来看一下?
- 2021年岳阳市高考成绩查询,2021年岳阳高考状元名单公布,岳阳文理科状元是谁多少分...
- 玛格丽特·米德2019下半年EI会议与人格理论初探
- Oracle分页查询存储过程(适用于单表查询)