首先我们需要先创建线程对象,假设只有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售票系统相关推荐

  1. python线程创建对象_Python使用面向对象方式创建线程实现12306售票系统

    目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更 ...

  2. Java售票方式_Java多线程之火车售票系统

    Java多线程之火车售票(Thread和Runnable的区别) java中实现多线程的方式有两种 继承Thread类 实现Runnable接口 继承了Thread类的类,使用对象.start()启动 ...

  3. linux多线程编写哲学家,Linux系统编程(三) ------ 多线程编程

    一.线程的创建和调度 1.线程是程序执行的某一条指令流的映像. 为了进一步减少处理机制的空转时间,支持多处理器及减少上下文切换开销,进程在演化中出现了另一个概念--线程.它是进程内独立的一条运行路线, ...

  4. Java多线程模拟售票系统

    Java创建多线程的两种基本方法: 方法1.继承Thread类 (1)定义子类,继承Thread类,重写该类的run()方法作为线程执行体; (2)创建该子类的实例作为线程对象; (3)调用线程对象的 ...

  5. 铁路售票系统_铁路资讯:复兴号动车、智能京张高铁…中国最高端铁路装备看这里...

    今天上午,两年一度的中国国际现代化铁路技术装备展在京开展,会期3天,将集中展示路网建设.客货运输.经营管理.工程建造.技术装备.旅客服务等铁路行业各领域的先进产品及技术. 展会现场 智能京张:将首次实 ...

  6. Java多线程案例:模拟12306火车站售票系统

    Java多线程案例:模拟12306火车站售票系统 该系统一共涉及到3个类: 车票(Ticket) 12306系统(System12306) 售票窗口(Window) 车票类,涉及三个属性: 起始站 终 ...

  7. 运用多线程知识写一个火车站售票系统

    题目简介: 在现实世界中有一种数据模型,模拟生产者与消费者模型.如火车票售票系统,将票据的数量录入服务器我们称之为"生产"了若干车票.各地终端会共享这些车票信息去售票.直到车票售票 ...

  8. 利用JAVA多线程模拟售票系统,对统一资源进行处理

    首先多线程处理统一资源的方式有两种 分别介绍一下两者的区别 synchronized与Lock的区别 1.Lock不是Java语言内置的,synchronized是Java语言的关键字 2.synch ...

  9. 火车售票系统c语言编程,基于C语言实现简单的12306火车售票系统.pdf

    基基于于C语语言言实实现现简简单单的的12306火火车车售售票票系系统统 程序设计要求用C语言写一个简单的火车售票系统,主要实现的功能为: 入班次信息 浏览班次信息 按班次号查询 按终点站查询 按余票 ...

最新文章

  1. mysql查看数据文件ibdata_如何从 ibdata文件 恢复 MySQL 数据库
  2. linux命令详解:md5sum命令
  3. node.js JS对象和JSON字符串之间的转换
  4. 【华为敏捷/DevOps实践】6.架构师在新兴的DevOps组织应该扮演什么样的角色?
  5. epoll示例程序——服务端
  6. Kubernetes详解(十七)——Pod存活性探针应用实战
  7. 智能优化算法:适应度相关优化算法 - 附代码
  8. wps分析工具库如何加载_怎么在wps表格里面加入“数据分析”工具啊?
  9. mapgis转arcgis
  10. c盘存放文件夹的功能
  11. jflash烧录教程_Flash基础入门之J-Link固件烧录以及使用J-Flash向arm硬件板下载固件程序...
  12. pycharm主题背景图片设置,让你的界面酷起来!
  13. Found existing installation:xxxx
  14. travis ci java_Travis CI使用经验
  15. Linux系统的优点小结
  16. 如何解决MathPage.wll文件找不到问题
  17. 自己写一个strcmp函数(C++)
  18. 微信小程序 关于下载文件、打开文件预览文件(wx.downloadFile和wx.openDocument)
  19. 基于JPVideoPlayerKit的小视频播放
  20. 知乎网的CSS命名规律研究

热门文章

  1. 少吃调料竟然是错的!这9种调料原来是长寿高手
  2. 修改WINVER、_WIN32_WINNT和_MSC_VER
  3. 非主流闪图头像教程:扩散粒子效果
  4. 入门SAP MM的学习流程
  5. CSP 寻宝!大冒险! C++
  6. 交叉编译lrzsz(用于串口传输文件)
  7. 狗哥历经四个小时整理大佬的内容,你确定不来看一下?
  8. 2021年岳阳市高考成绩查询,2021年岳阳高考状元名单公布,岳阳文理科状元是谁多少分...
  9. 玛格丽特·米德2019下半年EI会议与人格理论初探
  10. Oracle分页查询存储过程(适用于单表查询)