票超卖的案例,代码如下:
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张