黑马程序员技术交流社区

标题: 同步代码块的对象问题 [打印本页]

作者: 刘海东    时间: 2013-5-27 09:14
标题: 同步代码块的对象问题
本帖最后由 刘海东 于 2013-5-27 11:18 编辑

在写代码的时候,很自以为是的就想偷懒
就写了对象的简写格式
然后运行结果就出错了
请大家帮我看看
谢谢
  1. public class TicketDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Ticket t = new Ticket();//创建票的对象

  6.                 Thread t1 = new Thread(t);//创建线程,并把Runnable接口的子类对象传递给Thread的子类对象
  7.                 Thread t2 = new Thread(t);
  8.                 Thread t3 = new Thread(t);
  9.                 t1.start();//开启线程
  10.                 t2.start();
  11.                 t3.start();
  12.         }
  13. }
  14. class Ticket implements Runnable//实现Runnable接口
  15. {
  16.         private int num = 100;
  17.         <font color="red">//Object obj = new Object();//这里如果是这样写的话,程序运行时不会生成错票</font>
  18.         public void  run()//复写run方法,把需要被多线程执行的代码写入run方法中
  19.         {
  20.                 while(true)
  21.                 {
  22.                         <font color="red">synchronized(new Object())//这里把对象简写的话,就打印错票了,</font>
  23. {
  24.                                 if(num>0)
  25.                                 {
  26.                                         try{Thread.sleep(10);}
  27.                                         catch(Exception e){}
  28.                                         System.out.println(Thread.currentThread().getName()+"...ticket sale..."+num--);
  29. }
  30.                         }
  31.                 }
  32.         }
  33. }
复制代码
我都试了一下,为什么不能用简写的格式创建对象。难道那个对象被垃圾回收了??????????????

作者: 张俊迪    时间: 2013-5-27 09:22
如果你要是在synchronized中new对象的话是不是你们每次判断锁的时候都会生成一个对象,那么就会生成多个锁,只要判断就会生成一个锁,而同步的时候是能有一个锁
作者: lpflpy    时间: 2013-5-27 09:43
你直接用synchronized(new Object());这样的话,每个线程进来都会重新创建一个新的对象,违背了锁的对象必须是同一个的原则,当然会出错了。
作者: 黄丽军    时间: 2013-5-27 09:54
每次都生成了新”锁“吧,所有线程应该用同一个锁。
作者: 曹德君    时间: 2013-5-27 11:11
  1. package cm.nti56;
  2. public class TicketDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Ticket t = new Ticket();//创建票的对象

  7. /*              Thread t1 = new Thread(t);//创建线程,并把Runnable接口的子类对象传递给Thread的子类对象
  8.                 Thread t2 = new Thread(t);
  9.                 Thread t3 = new Thread(t);
  10.                 t1.start();//开启线程
  11.                 t2.start();
  12.                 t3.start();*/
  13.                //开启线程
  14.                 new Thread(t).start();
  15.                 new Thread(t).start();
  16.                 new Thread(t).start();
  17.         }
  18. }
  19. class Ticket implements Runnable//实现Runnable接口
  20. {
  21.         private int num = 100;
  22.         //创建同步锁,要在while循环前创建不然会创建很多不同的实例对象,那样就是多个锁了。
  23.        Object obj = new Object();
  24.         public void  run()//复写run方法,把需要被多线程执行的代码写入run方法中
  25.         {
  26.                 while(true)
  27.                 {
  28.                     synchronized(obj)
  29. {
  30.                                 if(num>0)
  31.                                 {
  32.                                         try{Thread.sleep(10);}
  33.                                         catch(Exception e){}
  34.                                         System.out.println(Thread.currentThread().getName()+"...ticket sale..."+num--);
  35. }                        }
  36.                 }
  37.         }
  38. }
复制代码





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