案例:
铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果
窗口001正在销售第1000张票
窗口001正在销售第999张票
窗口002正在销售第998张票
.。。。
窗口05正在销售第1张票
票已经销售完毕
下面我们就此系统进行一个简单的分析:
代码编写可能会出现的问题及解决案:
-
出现部分重票-------原因:每个线程都有可能去执行打印总票数
解决方案:加锁确保线程安全,注意锁的范围,锁的对象 -
代码执行出现负数--------原因:多个线程都进入循环的判断,在锁外等待
解决方案:在锁内增加判断
注意:每个线程执行完都要退出
需要导入的包为
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: