并发实例,超卖案例

275 阅读1分钟

票超卖的案例,代码如下:

import java.util.concurrent.CountDownLatch;

public class Ticket {

    private static CountDownLatch ctl = new CountDownLatch(1);
    Integer stock = 8;

    public void reduce(int num){
        if (stock - num >= 0) {
            try{
                ctl.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            stock -= num;

            System.out.println(Thread.currentThread().getName()
                    + "成功:卖出" + String.valueOf(num) + "张,库存剩余" + stock + "张");
        } else {
            System.err.println(Thread.currentThread().getName()
            +"s失败:库存不足" + String.valueOf(num) + "张,库存剩余" + stock + "张");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        final Ticket ticket = new Ticket();

        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    ticket.reduce(1);
                }
            },"用户"+(i+1)).start();
        }
        Thread.sleep(1000);
        ctl.countDown();

    }
}

输出结果为

用户3成功:卖出1张,库存剩余6张
用户8成功:卖出1张,库存剩余3张
用户6成功:卖出1张,库存剩余2张
用户7成功:卖出1张,库存剩余4张
用户2成功:卖出1张,库存剩余5张
用户4成功:卖出1张,库存剩余6张
用户1成功:卖出1张,库存剩余0张
用户10成功:卖出1张,库存剩余1张
用户9成功:卖出1张,库存剩余-2张
用户5成功:卖出1张,库存剩余-1张