java 卖票 多线程超卖

package thread;

/**
 * @author miller
 * @date 2022/10/28  3:24 PM
 */
public class TicketWindow2 implements Runnable {
    private int ticket = 300;

    @Override
    public void run() {
        int a = 0;
        while (true) {
//            try {
//                Thread.sleep(500); // todo 加了之后 后边卖出票数 相加 会发现超过30张了
            // todo 不加 sleep ,复现不了超卖
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "卖出了第" + ticket-- + "张票," + "剩余" + ticket + "张票");
                a ++;
            } else {
                System.out.println(Thread.currentThread().getName() + "余票不足,停止售票!");
                break;
            }
        }
        System.out.println(Thread.currentThread().getName() + "====共卖出 " +  a);
    }
}

 class SellTicketTest2 {
    public static void main(String[] args) {
        TicketWindow2 tw = new TicketWindow2(); //

        for (int i = 1; i < 4; i++) {
            Thread t = new Thread(tw,"窗口"+i);
            t.start();
        }
    }
}

变量ticket . 同时判断>0, 结果是1. 同时-1

评论