购票场景:多人在多个窗口购买N张票
多个窗口同时售票
public void run() {
while(total>0){
sale();
}
}
public synchronized void sale() {
if(total>0) {
System.out.println(Thread.currentThread().getName()+"卖了第"+count+"张票");
total--;//票总数
count++;//第X张票
}
}
通过synchronized 关键字修饰方法(也可以修饰代码块)达到同步效果,实现一票一卖。synchronizedtonb同步方法内还需要判断一次票数是total>0,因为在卖最后一张票时,其他线程会堵塞在同步方法外,待解锁后继续“卖票”,这样会出现超卖现象。
由图1可以发现窗口26连续卖多张票,这是因为cpu按时间片给线程分配资源,一个线程在分配的时间片内连续运行直到阻塞、死亡或者时间片用完处于就绪状态。
客户排队买票
场景:一轮放票一个客户只能买一张(一次)。
一人