package com.neutron.t21;
import java.util.Vector;
import java.util.concurrent.TimeUnit;
/**
* 有N张火车票,每张票都有1个编号,同时有10个窗口对外售票
*
* 分析下面程序可能存在哪些问题:重复售票,还是超量售票?
*/
public class Ticket2 {
/* 使用同步容器 */
static Vector<String> tickets = new Vector<>();
static {
for (int i = 0; i < 10000; i++) {
tickets.add("No:" + i);
}
}
/**
* 为什么会存在问题?
* 判断和操作相分离,即while时和remove之间存在问题。虽然size和remove都是原子性,但是两者组合并非是原子性
* 案例中使用睡6毫秒来测试
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
while (tickets.size() > 0) {
try {
TimeUnit.MICROSECONDS.sleep(6);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sell ticket:" + tickets.remove(0));
}
}).start();
}
}
}
thread30 - 卖票2
最新推荐文章于 2021-10-03 21:36:02 发布