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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 风乐 中级黑马   /  2013-5-8 00:19  /  1067 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 风乐 于 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的结果么

1 个回复

倒序浏览
   线程不安全导致   你把锁加错了   你应该放在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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马