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

2.synchronized不需要用户手动释放锁,lock 需要用户手动释放锁,当synchronized代码块中的代码执行完成后会自动释放锁

3.lock 需要手动上锁和手动释放锁,如果不释放锁就会造成死锁

4.注意 使用同步锁时,lock() 后 同步代码块最好 用try{}括起来,然后在finnally{}里写释放锁 unlock()防止运行过程中出错然后出现死锁现象

使用synchronized方式编写售票系统
第一步:编写共享资源类,这里的共享资源类 对应的就是票的数量
然后定义synchronized方法 任何线程进入该方法后,锁住该资源直到线程结束访问后解锁允许下一个线程访问

class Tickets{//    默认还剩40张票private int tickets=40;public Tickets(int tickets) {this.tickets = tickets;}public Tickets() {}public int getTickets() {return tickets;}public void setTickets(int tickets) {this.tickets = tickets;}
//设置同步方法  使所有线程共享该信息  sells 用户的购买票数public   synchronized void  sellTicket(int sells){// 判断售票员卖票时 是否还有余票,以及 用户一次性买票的数是否超过余票if (tickets>0&&tickets>=sells){tickets=tickets-sells;System.out.println(Thread.currentThread().getName()+"售出"+sells+"票   剩余"+tickets+"张");
            如果此时售票剩余0张,直接结束程序if (tickets==0){System.out.println("已售完");System.exit(1);}}else {System.out.println(Thread.currentThread().getName()+"抱歉!!余票不足,请重新选择购买票数");}}}

第二步 编写多线程 对这一个资源进行处理,也就是编写线程 对该资源进行抢夺 每一个线程就相当于一个售票员 多个售票员对固定资源的争夺

//设置多线程
public class Sell {public static void main(String[] args) {//初始化 票信息thread.Tickets tickets=new thread.Tickets();
//循环票数等于0,跳出while (tickets.getTickets()>0){//            线程1:new Thread(() -> {//设置随机值 表示单个售票员每次售出的票数 范围规定在 1~5之间Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);}, "售票员1").start();//线程2new  Thread(() -> {Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);},"售票员2").start();
//        线程3new  Thread(() ->{Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);},"售票员3").start();}}}
// 输出结果由于是售票员随机售票 因此结果不唯一:
售票员1售出4票   剩余36张
售票员2售出4票   剩余32张
售票员3售出3票   剩余29张
售票员1售出5票   剩余24张
售票员2售出2票   剩余22张
售票员3售出3票   剩余19张
售票员1售出1票   剩余18张
售票员2售出5票   剩余13张
售票员3售出2票   剩余11张
售票员1售出3票   剩余8张
售票员2售出3票   剩余5张
售票员3售出3票   剩余2张
售票员1抱歉!!余票不足,请重新选择购买票数
售票员1抱歉!!余票不足,请重新选择购买票数
售票员3抱歉!!余票不足,请重新选择购买票数
售票员2售出1票   剩余1张
售票员2售出1票   剩余0张
已售完

完整的 利用 synchronize关键字实现多线程模拟售票系统代码

package thread;import java.util.Random;
//定义一个存储票信息类
class Tickets{//    默认还剩40张票private int tickets=40;public Tickets(int tickets) {this.tickets = tickets;}public Tickets() {}public int getTickets() {return tickets;}public void setTickets(int tickets) {this.tickets = tickets;}
//设置同步方法  使所有线程共享该信息  sells 用户的购买票数public   synchronized void  sellTicket(int sells){// 判断售票员卖票时 是否还有余票,以及 用户一次性买票的数是否超过余票if (tickets>0&&tickets>=sells){tickets=tickets-sells;System.out.println(Thread.currentThread().getName()+"售出"+sells+"票   剩余"+tickets+"张");
            如果此时售票剩余0张,直接结束程序if (tickets==0){System.out.println("已售完");System.exit(1);}}else {System.out.println(Thread.currentThread().getName()+"抱歉!!余票不足,请重新选择购买票数");}}}//设置多线程
public class Sell {public static void main(String[] args) {//初始化 票信息thread.Tickets tickets=new thread.Tickets();
//循环票数等于0时,跳出while (tickets.getTickets()>0){//            线程1:new Thread(() -> {Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);}, "售票员1").start();//线程2new  Thread(() -> {Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);},"售票员2").start();
//        线程3new  Thread(() ->{Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);},"售票员3").start();}}}

使用Lock接口方式编写售票系统

package lock;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;//定义一个存储票信息类
class Tickets{//    默认还剩40张票private int tickets=40;
//    创建可重入锁
private Lock lock= new ReentrantLock();public Tickets(int tickets, Lock lock) {this.tickets = tickets;this.lock = lock;}public Tickets() {}public int getTickets() {return tickets;}public void setTickets(int tickets) {this.tickets = tickets;}//设置同步方法  使所有线程共享该信息  sells 用户的购买票数public    void  sellTicket(int sells){//        上锁lock.lock();try {// 判断售票员卖票时 是否还有余票,以及 用户一次性买票的数是否超过余票if (tickets>0&&tickets>=sells){tickets=tickets-sells;System.out.println(Thread.currentThread().getName()+"售出"+sells+"票   剩余"+tickets+"张");
            如果此时售票剩余0张,直接结束程序if (tickets==0){System.out.println("已售完");System.exit(1);}}else {System.out.println(Thread.currentThread().getName()+"抱歉!!余票不足,请重新选择购买票数");}}finally {//            同步代码出现异常时 始终会执行释放锁,否则//        解锁lock.unlock();}}}//设置多线程
public class Thread_Lock {public static void main(String[] args) {//初始化 票信息Tickets tickets=new Tickets();
//循环票数等于0时,跳出while (tickets.getTickets()>0){//            线程1:new Thread(() -> {Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);}, "售票员1").start();//线程2new  Thread(() -> {Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);},"售票员2").start();
//        线程3new  Thread(() ->{Random random=new Random();int romdan= random.nextInt(5)+1;tickets.sellTicket(romdan);},"售票员3").start();}}}

利用JAVA多线程模拟售票系统,对统一资源进行处理相关推荐

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

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

  2. Java多线程实现售票系统

    学习多线程比较经典的案例就是实现售票系统了. 我们先来看看需求:铁道部发布了一个售票任务,要求销售100张票,要求有5个窗口来进行销售,效果如下: 窗口001正在销售第100张票窗口001正在销售第9 ...

  3. Java多线程 模拟售票窗口售票

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票 程序分析: 1.票数要使用同一个静态值: 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 创建一个站台类Stat ...

  4. Java——多线程(铁路售票系统案例)

    问题:铁路售票,一共100张,通过四个窗口卖完. 要求:分别用 继承Thread类 和 实现Runnable接口 去实现 ①用继承Thread类去实现 package com.yy.syn;publi ...

  5. java多线程模拟售票

    售票类: package duoxiancheng;import java.util.concurrent.TimeUnit;/*** @author yeqv* @program A2* @Clas ...

  6. java 模拟火车站售票系统_模拟售票系统java编程

    模拟售票系统java编程 /* 项目:用多线程设计一个模拟火车站售票大厅的工作情形. 问题描述:火车站有许多售票窗口,有些开放,有些不开放.顾客进入火车站售票厅后,到某个售票窗口排队等候,排到了就办理 ...

  7. Java模拟售票窗口代码_java多线程模拟售票,多个窗口售票

    package com.ma.thread001; /** * 多线程模拟售票,多个窗口售票 * @author ma * */ public class SellTicktDemo implemen ...

  8. java多线程模拟购买火车票

    java多线程模拟购买火车票 本次做的是一个火车票的售卖模拟,不管用户是在窗口还是APP上购买,必然不可能买到同一张票这也就是说一张票的售卖必然是一个线程在操作的,所以,我们在写代码是也要注意这一点 ...

  9. php curl 模拟多线程,php利用curl 多线程 模拟 并发的详解

    php利用curl 多线程 模拟 并发的详解 发布于 2014-12-07 10:17:25 | 265 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypert ...

最新文章

  1. 包邮送25本经典书籍,无任何套路!
  2. android web3j 代币查询_wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账
  3. 百度大脑发挥AI“头雁效应” 王海峰:在AI时代共同推动社会智能化升级
  4. PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB
  5. '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法...
  6. Hadoop节点热拔插
  7. 生产者消费者模型、信号量、线程池以及单例模式的实现
  8. [洪流学堂]Hololens开发入门篇3:使用基本功能开发一个小应用
  9. 苹果手机html查看器在哪,web前端案例-苹果手机图片查看器
  10. Blog Contents
  11. 简单工具之 ---- IP地址快速修改脚本
  12. 雨林木风 ghost win7 纯净版系统下载
  13. js设置一个打点计时器
  14. Python代码实现将png格式图片批量转换为jpg个格式
  15. linux清除系统垃圾文件
  16. HDFS启动报错Expected to be able to read up until at least txid but unable to find any edit logs
  17. 倍福PLC和C#通过ADS通信传输bool类型变量
  18. android(4) 使用ViewPaper 以及这几年来的一些感悟
  19. 【有限元分析】异型密封圈计算泄漏量与参数化优化过程(带分析源文件)
  20. 对现在糟糕的自己剖析

热门文章

  1. 哈工大软件构造lab2实验报告
  2. 【Machine Learning 学习笔记】feature engineering中noisy feature的影响
  3. Android权限申请哪些需要动态申请
  4. Bayesian Nonparametric Learning of Cloth Models for Real-Time State Estimation
  5. 服务器判断是手机访问网址还是电脑访问网址
  6. 泛微实物档案数字化管理方案,全面优化组织档案管理
  7. 控制结构(强化):18.今夕何夕
  8. BioNano生物纳米分子的“原始数据到完成装配和组装分析”管线与基于序列的基因组FASTA映射...
  9. c语言整点报时,C语言编写一个简单整点报时工具源代码
  10. 干货 | 携程微信小程序如何进行Size治理