(1)为什么count变成104:
第一你的多线程操作同一份数据用的不是同一把锁,所以当一个线程进入同步代码块等待时,其他线程也可以进入同步代码块,会造成线程安全问题。
因为线程结束的控制条件是ticketnum=0;也就是说只有ticketnum>0的时候,t1,t2,t3,t4,t5才可以进入同步代码块。
所以你的锁应该在while( ticketnum > 0)里面。
如果你这样写:当一个线程进入同步代码块,刚好判断完ticketnum的值为1,此线程挂在这儿。
此时又有新的线程进入同步代码块,判断ticketnum == 1也进入了同步代码块。
这样就是多个线程卖最后一张票,但是只有一张票,所以会出现负数票,count也就大于100了。
(2)while换成if就出来5张票:
因为主线程把t1,t2,t3,t4,t5开启之后,它们各自都卖了一张票,然后t1,t2,t3,t4,t5线程都已经结束了。
因为没有循环去卖剩下的票,if()只是一次判断条件,每个线程都判断一次,然后结束了线程。
(3)Thread.sleep()放在while()中卖不到100张票:
这个你多试几次,其实不是卖不到100张。我试的结果是可以买到90多张,可以买到100张,也可以买到101张。
这都是线程安全出问题造成的。
解决办法:
(1)t1,t2,t3,t4,t5五个线程操作ticketnum这一份数据必须使用同一把锁。
(2)进入同步代码的条件应该放在锁的外面。
具体代码楼上写的很好了,参考一下~~
|