黑马程序员技术交流社区

标题: 多线程卖票小程序出现负数,请大神指教 [打印本页]

作者: visen    时间: 2015-8-21 23:42
标题: 多线程卖票小程序出现负数,请大神指教
  1. //卖票小程序
  2. class Ticket  implements Runnable//extends Thread
  3. {
  4.         private  int tick=100;//票的数量
  5.         Object obj=new Object();
  6.         public void run()
  7.         {
  8.                 while(tick>0)
  9.                 {
  10.                         synchronized(obj)//同步代码块
  11.                         {
  12.                                 try{Thread.sleep(10);}catch(Exception e){}
  13.                                 System.out.println(Thread.currentThread().getName()+" sale:"+tick--);       
  14.                         }
  15.                 }
  16.         }

  17. }
  18. class TicketDemo2
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 Ticket t=new Ticket();
  23.                 Thread t1=new Thread(t);
  24.                 Thread t2=new Thread(t);
  25.                 Thread t3=new Thread(t);
  26.                 Thread t4=new Thread(t);
  27.                 t1.start();
  28.                 t2.start();
  29.                 t3.start();
  30.                 t4.start();
  31.         }
  32. }
复制代码


运行结果:
......
......
Thread-0 sale:5
Thread-0 sale:4
Thread-0 sale:3
Thread-0 sale:2
Thread-0 sale:1
Thread-3 sale:0
Thread-2 sale:-1
Thread-1 sale:-2
我已经使用同步代码块了,为什么还会出现0,-1,-2的票呢,还请大家多多指教。
作者: liuch111    时间: 2015-8-22 10:01
把   while(tick>0)
                {
放到同步代码块里去
作者: fantianfei    时间: 2015-8-22 10:07

class Ticket implements Runnable
{
        private int num = 100;
        Object obj = new Object();
        public void run()
        {
                while (true)
                {
                        synchronized(obj){
                                if (num>0)
                                {
                                        System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
                                }
                        }
                }
        }
}

class ThreadDemo
{
        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();
        }
}
作者: backin    时间: 2015-8-22 10:10
同上!你是先判断在同步的话,几个线程同时在判断都是>0 的然后在排队执行同步块,出现负数那是肯定的啦!

作者: 雾里看花。    时间: 2015-8-22 10:50
把while(tick>0) 换成  while (true)  就可以了撒
作者: visen    时间: 2015-8-22 22:42
liuch111 发表于 2015-8-22 10:01
把   while(tick>0)
                {
放到同步代码块里去

谢谢哈,果然是这个原因
作者: visen    时间: 2015-8-22 22:44
fantianfei 发表于 2015-8-22 10:07
class Ticket implements Runnable
{
        private int num = 100;

非常感谢
作者: visen    时间: 2015-8-22 22:48
雾里看花。 发表于 2015-8-22 10:50
把while(tick>0) 换成  while (true)  就可以了撒

谢谢哈,终于弄明白了
作者: heima_cy    时间: 2015-8-22 22:57
哈哈  这个看来要是要多看比老师的视频啊  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2