/*
存在的问题:
当num=1时,假如线程t1此时拿到CPU,执行任务代码,在判断if语句条件刚刚结束时,也就是还没来得及执行输出语句,CPU被t2抢走了,此时num依然等于1,那么if条件通过,在执行过程中,依然可能被其他线程抢走CPU而进入阻塞状态,最后有可能卖出0,-1,-2这种票,这就是多线程存在的安全问题
*/
class Ticket implements Runnable{
public int num = 50;
public void run(){
while(true){
if(num>0){ //t1 t2 t3 t4
//模拟存在的安全问题,在此强制线程放弃CPU,执行结果如图
try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
}
}
}
class test{
public static void main(String[] args){
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
执行结果: