黑马程序员技术交流社区

标题: 求教 为什么加了syncronized同步代码块仍然出现负票 [打印本页]

作者: @在路上    时间: 2014-12-2 22:11
标题: 求教 为什么加了syncronized同步代码块仍然出现负票
本帖最后由 @在路上 于 2014-12-2 22:16 编辑
  1. class MaiPiao implements Runnable// extends Thread
  2. {    private  int ticket =100;  //static 生命周期过长
  3.          
  4.         public void run()
  5.         {
  6.                 while (true)
  7.                 {   synchronized(this)
  8.                         {
  9.                              if(ticket>0)//子类抛出的异常类型不能比父类抛出的异常类型更宽泛 因为是接口
  10.                                          try{Thread.sleep(10);}catch(Exception e){}        //将这行注释才不会出现负票求解                                                      
  11.                             System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);
  12.                                                                  //Thread.currentThread中的Thread类为何能不能省略
  13.                         }
  14.                 }
  15.         }
  16. }

  17. class  TicketDemo
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                    MaiPiao p=new MaiPiao();
  22.                       Thread t1=new Thread(p);
  23.               Thread t2=new Thread(p);
  24.                           Thread t3=new Thread(p);
  25.                           Thread t4=new Thread(p);
  26.                           t1.start();
  27.                           t2.start();
  28.                           t3.start();
  29.                           t4.start();
  30.         }
  31. }
复制代码
刚又看了下是if()没加{} :L

作者: 龙骑将杨影枫    时间: 2014-12-2 22:50
因为你少加了对括号。
注意看这里:
if(ticket>0)//子类抛出的异常类型不能比父类抛出的异常类型更宽泛 因为是接口
                                         try{Thread.sleep(10);}catch(Exception e){}        //将这行注释才不会出现负票求解                                                      
                            System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);
我格式化写一下
if(ticket>0)
try{Thread.sleep(10);}catch(Exception e){}  ;//这是第一句
   System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);//这是第二句
换句话说,只有当ticket>0 时才进行 第一句。而无论ticket如何取值,是不影响第二句的。
当你把第一句注释掉,第二句当然变成了第一句,也就是标准的if结构。
你只要
if(ticket>0)  {
try{Thread.sleep(10);}catch(Exception e){}  ;//这是第一句
   System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);//这是第二句
}
把两句括起来,就可以了。(我猜你是这么想的吧)

作者: @在路上    时间: 2014-12-4 21:52
做题眼花了  看了好半天才发现括号问题 :D




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