多线程实现火车票贩卖

应用三种办法实现:
(1)基于runnable atomicInteger
(2)基于runnable synchronized
(3)基于runnable reentrantlock

具体代码:

package com.high.ticket;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class TickerSeller01 implements Runnable{    public static AtomicInteger ticketSum = new AtomicInteger(Constant.ticketSum);    @Override    public void run() {        int count = 0;        while ((count=ticketSum.decrementAndGet()) >= 0) {            try {                TimeUnit.MILLISECONDS.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName() + "卖出了第" + ++count + "张票");        }    }    public static void main(String[] args) {        Thread t1 = new Thread(new TickerSeller01(), "一号窗口");        Thread t2 = new Thread(new TickerSeller01(), "二号窗口");        Thread t3 = new Thread(new TickerSeller01(), "三号窗口");        Thread t4 = new Thread(new TickerSeller01(), "四号窗口");        t1.start();        t2.start();        t3.start();        t4.start();    }}
package com.high.ticket;import java.util.concurrent.TimeUnit;public class TickerSeller02 implements Runnable{    private int index = 1;    private boolean change = true;    private final static Object object = new Object();    @Override    public void run() {        synchronized (object) {            while (index <= Constant.ticketSum && change) {                System.out.println(Thread.currentThread().getName() + " 卖出了第: " + (index++) + "张票");                try {                    TimeUnit.MILLISECONDS.sleep(100);                } catch (InterruptedException e) {                    e.printStackTrace();                }                change = false;            }            change = true;        }    }    public static void main(String[] args) {        final TickerSeller02 task = new TickerSeller02();        for (int i = 0; i < Constant.ticketSum / 4 + 1; i++) {            Thread windowThread1 = new Thread(task, "一号窗口");            Thread windowThread2 = new Thread(task, "二号窗口");            Thread windowThread3 = new Thread(task, "三号窗口");            Thread windowThread4 = new Thread(task, "四号窗口");            windowThread1.start();            windowThread2.start();            windowThread3.start();            windowThread4.start();        }    }}
package com.high.ticket;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class TickerSeller03 implements Runnable{    private Lock lock = new ReentrantLock();    @Override    public void run() {        while (Constant.ticketSum > 0) {            try {                lock.lock();                sellTicket();            } finally {                // 开释锁                lock.unlock();            }        }    }    private void sellTicket() {        if (Constant.ticketSum > 0) {            try {                TimeUnit.MILLISECONDS.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName() + " 正在发售第  " + (Constant.ticketSum--)+ "张票");        }    }    public static void main(String[] args) {        // 创立资源对象        TickerSeller03 task = new TickerSeller03();        for(int i = 0; i < Constant.ticketSum/4 + 1; i++) {            Thread windowThread1 = new Thread(task, "一号窗口");            Thread windowThread2 = new Thread(task, "二号窗口");            Thread windowThread3 = new Thread(task, "三号窗口");            Thread windowThread4 = new Thread(task, "四号窗口");            windowThread1.start();            windowThread2.start();            windowThread3.start();            windowThread4.start();        }    }}

github