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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

写的一个卖票线程,代码如下:
  1. class Ticket implements Runnable
  2. {
  3.         private int num=100;
  4.         Object obj=new Object();//obj即为同步锁
  5.         Boolean flag=true;//flag用于跳出while循环
  6.         public void run()
  7.         {
  8.                 synchronized(obj)
  9.                 {
  10.                         while(flag)
  11.                         {
  12.                                 if(num>0)
  13.                                 {
  14.                                         try{Thread.sleep(100);}catch(Exception e){}
  15.                                         System.out.println(Thread.currentThread().getName()+"...sale:"+num--);
  16.                                 }
  17.                                 else
  18.                                 {
  19.                                         flag=false;
  20.                                 }
  21.                         }
  22.                 }
  23.         }
  24. }

  25. class Thread1
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 Ticket t=new Ticket();
  30.                 Thread t1=new Thread(t);
  31.                 Thread t2=new Thread(t);
  32.                 Thread t3=new Thread(t);
  33.                 Thread t4=new Thread(t);
  34.                 t1.start();
  35.                 t2.start();
  36.                 t3.start();
  37.                 t4.start();
  38.         }

  39. }
复制代码

可是在执行时,一直都只有线程0被执行了,其他三个线程都没有被执行,即使将num设置为1000也是如此,不知道为什么,所以求各位大神帮忙解答。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

7 个回复

倒序浏览
不要讲while循环放在synchronized里面~试试将 synchronized(obj)放在while和if之间~
回复 使用道具 举报
ZSMAN 发表于 2015-5-25 18:26
不要讲while循环放在synchronized里面~试试将 synchronized(obj)放在while和if之间~

嗯,经你一点拨忽然发现确实应该synchronized放在while内,不然一旦一个线程进入while,那就必须等while循环执行完才能再次释放锁,让四个线程重新抢资源,可是此时,100张票都已经买完了。而且经验证将synchronized放while里面确实就OK了。谢谢你了~
回复 使用道具 举报
第一个线程进去 synchronized(obj)

09.                {

10.                        while(flag)

11.                        {

12.                                if(num>0)

13.                                {

14.                                        try{Thread.sleep(100);}catch(Exception e){}

15.                                        System.out.println(Thread.currentThread().getName()+"...sale:"+num--);

16.                                }

17.                                else

18.                                {

19.                                        flag=false;

20.                                }

21.                        }

22.                }

被锁住出不来了   ,
回复 使用道具 举报
while循环放在同步内第一个线程进去以后一直为true会一直执行完
回复 使用道具 举报
ZSMAN 发表于 2015-5-25 18:26
不要讲while循环放在synchronized里面~试试将 synchronized(obj)放在while和if之间~

楼上正解
回复 使用道具 举报
因为第一个线程拿到了obj这把锁,其他线程就拿不到锁只能干等着~
回复 使用道具 举报
路过学习~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马