黑马程序员技术交流社区

标题: 为什么synchronized()中的对象不能直接new 对象 [打印本页]

作者: QQ被盗    时间: 2013-11-28 12:56
标题: 为什么synchronized()中的对象不能直接new 对象
为什么synchronized()中的对象不能直接new 对象,如:synchronized(new Object())
作者: 陪你等日出    时间: 2013-11-28 13:14
哥们测试过了没?我以前用毕老师讲的那个卖票程序试了下,完全没问题,可以直接new对象啊
  1. class Ticket implements Runnable
  2. {
  3.         private int num = 2000;
  4.         //Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 while (true)
  8.                 {
  9.                         synchronized(new Object())
  10.                         {
  11.                                 show();
  12.                         }
  13.                 }
  14.         }
  15.         public synchronized void show()
  16.         {
  17.                 if (num>0)
  18.                 {
  19.                         try
  20.                         {
  21.                                 Thread.sleep(10);
  22.                         }
  23.                         catch (Exception e){}
  24.                         System.out.println(Thread.currentThread().getName()+"...sale :"+num--);
  25.                 }
  26.         }
  27. }
复制代码

主函数我就不写上了,就是开启线程
作者: QQ被盗    时间: 2013-11-28 13:37
class MyTicket implements Runnable
{
        private int ticket = 100;
       
        public void run(){
                Object obj = new Object();
                while(true){       
                        synchronized(obj){
                                if(ticket>0){
                                        try{
                                                Thread.sleep(10);
                                        }catch(Exception e){}
                                        System.out.println(ticket--);
                                }
                        }
                }
        }
}

但是我这段代码会出现第0张票
作者: QQ被盗    时间: 2013-11-28 13:38
而且,你那好像最终的锁是this锁吧,不是new Object()的对象锁吧?
作者: 狼王    时间: 2013-11-28 19:56
毕老师的视频讲的很清楚,因为这样会就不会是同一把锁了
作者: QQ被盗    时间: 2013-11-28 21:33
哦,是不是放到外面就是同一把锁,因为我把Object obj = new Object()放到run()方法外就可以了,看来毕老师的视频后,发现又忘记了锁的问题




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