窗口卖票的问题

多线程卖票

4个线程同时卖票,共计100张

import java.util.concurrent.ExecutorService; import
java.util.concurrent.Executors;

/** * 本类用于改造售票案例,用于解决多线程编程安全问题 * 需求:4个线程同时卖票,共计卖票100张 *
问题1:重卖:一张票卖给了多个人 * 问题2:超卖:卖出了0 -1 -2张票 * /
public class Main {
public static void main(String[] args) {
//5.创建接口实现类对象作为目标业务对象(就是卖票业务)
SaleTickets target=new SaleTickets();
//启动多个线程
//6.将目标业务对象与Thread做绑定,创建线程对象t1 // Thread t1=new Thread(target); /1.2对应的是新建状态/ // Thread t2=new
Thread(target); // Thread t3=new Thread(target); //
Thread t4=new Thread(target); // //7.启动多线程编程的效果 //
/1.1如果只创建一个线程对象,是单线程编程效果,不会出现数据问题/ //
t1.start();//由新建状态转为就绪状态,等待cpu调用不会立即执行 // t2.start(); //
t3.start(); // t4.start();
//使用线程池
/**6.线程池ExcutorService:用来存放线程的池子,新建线程/启动线程/销毁线程…
/
/*7.Excutors:用来创建线程池对象/
//newFixedThreadPool():创建一个指定线程数目的线程池
ExecutorService pool= Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
/*8.excute()让线程池中的线程来执行目标业务,每次调用,启动一个线程/
pool.execute(target);
//本方法的参数是执行的业务,也就是实现类的目标对象
}
pool.shutdown();//关闭线程池
} }

/*2.多线程中出现数据不安全的前提: * 多线程程序 + 有共享数据 + 多条语句操作共享数据 */
/3.同步锁:相当于把容易出现问题的代码锁起来 * 加锁范围:不能太大,也不能太小,太大,干啥都得排队,效率低 *
太小,锁不住,还是有安全隐患 * / //1.自定义线程类,通过实现Runnable接口的方式来完成 class SaleTickets
implements Runnable{
//定义静态成员变量用来保存票数
static int ticket=100;
//9.2创建一个唯一的锁对象,之后不论那个线程进入同步代码块
//使用的都是这个对象,唯一性很重要
Object o=new Object();
//2.添加未实现的方法run()写业务
/

* 如果一个方法中的代码块都被同步了,我们可以把这个方法改为同步方法
* 同步方法使用的锁对象是this
* 同步代码块使用的锁对象可以任意,只要是同一个锁对象就可以
/
@Override
public void run() {
//4.1通过循环的方式卖票,注意设置死循环入口
while (true){
/

* 4.同步代码块:synchronized(锁对象){}
* 是指同一时间这个代码块只能被一个线程享有
*/
synchronized (o){
//4.2通过if判断卖票的具体情况
if(ticket>0){
try {
//设置休眠方法,创建延迟效果
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//4.3打印当前售票线程名以及票数
System.out.println(
Thread.currentThread().getName()+"="+ticket–);
}
//4.4没票了,退出循环
if(ticket<=0)
break;
}
}
} }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值