售票问题
问题简介
编程模拟售票系统,有20张票,通过3个售票窗口卖票,每个窗口买票需要1-3秒的时间,每次卖票需要打印出买票的时间和买票的窗口名。
synchronized 同步锁
synchronized 同步锁类似于悲观锁机制,因此其他线程每次去拿数据的时候都认为这些线程会修改数据,所以每次有线程在拿数据的时候都会上锁,这样别的线程想拿这个数据就会 block 阻塞直到它拿到锁,也就是线程变成串行的了,所以 synchronize 同步锁尽量锁的范围越小越好。
代码实现
package com.lsx;
public class TicketSystem implements Runnable{
static int tickets = 20; // 票数
static boolean flag = true;
public static void sell()throws Exception {
//卖票
Judge();
// 线程休眠
int time = (int)(1 + Math.random()*3);
Thread.sleep(time*1000);
}
public synchronized static void Judge(){
if(tickets == 0){
System.out.println("购买失败");