黑马程序员技术交流社区

标题: 一点小疑惑 [打印本页]

作者: 风乐    时间: 2013-5-8 00:19
标题: 一点小疑惑
本帖最后由 风乐 于 2013-5-8 13:38 编辑

class Ticket implements Runnable
{
        private int num = 100;
        boolean flag = true;

        public void run()
        {
                if (flag)
                {
                        while (num>0)          //为什么还是会出现0票呢
                        {
                                synchronized (this)
                                {
                                        System.out.println(Thread.currentThread().getName()+"..."+num--);
                                }
                        }
                }
                else
                {
                        while(num>0)
                                twosale();

                }
        }

        public synchronized void twosale()
        {
                System.out.println(Thread.currentThread().getName()+"........."+num--);
        }
}

class error2
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
                t1.start();
                try
                {
                        Thread.sleep(10);
                }
                catch (Exception e)
                {
                }
                t.flag = false;
                t2.start();
        }
}


为什么打印结果会出现0票呢,num--不是先用再减么,那while(num>0)里打印结果,不应该不会出现0的结果么


作者: 刘兆华    时间: 2013-5-8 06:07
   线程不安全导致   你把锁加错了   你应该放在While外面 我把代码给你发上来   你自己看看 。

  1. class Ticket implements Runnable
  2. {
  3.         private int num = 100;
  4.         boolean flag = true;

  5.         public void run()
  6.         {
  7.                 if (flag)
  8.                 {
  9.                                         synchronized (this)
  10.                    {
  11.                         while (num>0)          //为什么还是会出现0票呢
  12.                         {
  13.                                 
  14.                                         System.out.println(Thread.currentThread().getName()+"..."+num--);
  15.                          }
  16.                    }
  17.                 }
  18.                 else
  19.                 {
  20.                                         synchronized (this)
  21.                                 {
  22.                         while(num>0)
  23.                                                         {
  24.                                                        
  25.                                 System.out.println(Thread.currentThread().getName()+"........."+num--);
  26.                                                         }
  27.                                         }
  28.                                 }
  29.         }

  30.       
  31. }

  32. class test
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                 Ticket t = new Ticket();
  37.                 Thread t1 = new Thread(t);
  38.                 Thread t2 = new Thread(t);
  39.                 t1.start();
  40.                 try
  41.                 {
  42.                         Thread.sleep(1);
  43.                 }
  44.                 catch (Exception e)
  45.                 {
  46.                 }
  47.                 t.flag = false;
  48.                 t2.start();
  49.         }
  50. }
复制代码





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