java多线程之线程安全----铁路售票系统的实现

本文通过模拟铁路售票系统,探讨了在Java中如何实现多线程安全地销售1000张票,分析了可能出现的并发问题,如重票和负数,提出了解决方案,包括使用锁确保线程安全,并强调了每个线程执行完必须退出的原则。
摘要由CSDN通过智能技术生成

案例:

铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果
窗口001正在销售第1000张票
窗口001正在销售第999张票
窗口002正在销售第998张票
.。。。
窗口05正在销售第1张票
票已经销售完毕

下面我们就此系统进行一个简单的分析:
代码编写可能会出现的问题及解决案:

  1. 出现部分重票-------原因:每个线程都有可能去执行打印总票数
    解决方案:加锁确保线程安全,注意锁的范围,锁的对象

  2. 代码执行出现负数--------原因:多个线程都进入循环的判断,在锁外等待
    解决方案:在锁内增加判断

注意:每个线程执行完都要退出

需要导入的包为

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

以下是三个方法的实现

class Task implements Runnable {
	private int ticket =1000;
	private Object obj=new Object();  //成员属性------synchronized (obj)需使用,其他方法可无视
	private Lock lock=new ReentrantLock(); //实例化互斥对象锁-------方法3需使用,其他方法可无视
	
	@Override
	public void run() {
/*		//方式2:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值