A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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的票呢,还请大家多多指教。

8 个回复

倒序浏览
把   while(tick>0)
                {
放到同步代码块里去
回复 使用道具 举报

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();
        }
}
回复 使用道具 举报
同上!你是先判断在同步的话,几个线程同时在判断都是>0 的然后在排队执行同步块,出现负数那是肯定的啦!
回复 使用道具 举报
把while(tick>0) 换成  while (true)  就可以了撒
回复 使用道具 举报
liuch111 发表于 2015-8-22 10:01
把   while(tick>0)
                {
放到同步代码块里去

谢谢哈,果然是这个原因
回复 使用道具 举报
visen 中级黑马 2015-8-22 22:44:47
7#
fantianfei 发表于 2015-8-22 10:07
class Ticket implements Runnable
{
        private int num = 100;

非常感谢
回复 使用道具 举报
visen 中级黑马 2015-8-22 22:48:17
8#
雾里看花。 发表于 2015-8-22 10:50
把while(tick>0) 换成  while (true)  就可以了撒

谢谢哈,终于弄明白了
回复 使用道具 举报
哈哈  这个看来要是要多看比老师的视频啊  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马