为什么出现0?
因为t1和t2持有不同的锁。t1和t2分别new了自己Object对象,因此synchronized(obj)持有的锁是不同的,假设当Thread-o执行到ticket=1时,if(ticket>0),满足,然后sleep(10)睡一会儿,此时Thread-1抢到执行权,通过ticket--打印1,并将ticket改为0,这时Thread睡醒了,拿着值为0的ticket输出了!
解决办法:1. 将两条线程的锁同步,可将Object变量改为静态的,即static Object obj=new Object();
2.把if(ticket>0),改为while(ticket>0),每个线程睡醒后都要判断ticket的值。 |