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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张君 于 2013-3-28 15:10 编辑

class Ticket implements Runnable
{
private  int tick = 1000;
Object obj = new Object();
public void run()
{
  while(true)
  {
   synchronized(obj)   // 此处传一个new Object()  作为 对象,和在外面Object obj = new Object(); 把obj 传进去有什么区别?给解释下原因

{
    if(tick>0)
    {
     try{Thread.sleep(10);}catch(Exception e){}
     System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
    }
   }
  }
}
}

class  TicketDemo2
{
public static void main(String[] args)
{
  Ticket t = new Ticket();
  Thread t1 = new Thread(t);
  Thread t2 = new Thread(t);
  Thread t3 = new Thread(t);
  Thread t4 = new Thread(t);
  t1.start();
  t2.start();
  t3.start();
  t4.start();

}
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
你这样子是使用不同的的锁了,因为run方法是线程调用的,如果你把锁放在里面,那就是相当于他们各自持有匿名锁。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果在synchronized()中是new Object()是创建一个对象,当多线程访问同步中的语句时,每一个线程会创建一个Objcet,所以用的不是同一个锁。
而在synchronized()中是在外面创建的Objcet时,多线程用的就是同一个锁了,这时候线程是同步的。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
new Object()是创建了一个新的obj对象。如果在synchronized( )中new  object就是每次跑线程的时候,一个线程新建一个obj的对象,这样的话obj对象就不是一个了,ynchronized( )是需要同一个对象才能同步的。在外面Object obj = new Object(),再传入synchronized( )中,只创建了一个对象,每一个线程调用run方法的时候使用的是同一个对象,就可以实现同步了。
回复 使用道具 举报
梁耀今 发表于 2013-3-28 13:36
你这样子是使用不同的的锁了,因为run方法是线程调用的,如果你把锁放在里面,那就是相当于他们各自持有匿 ...

:)明白了 感谢
回复 使用道具 举报
HM王琦 发表于 2013-3-28 13:43
如果在synchronized()中是new Object()是创建一个对象,当多线程访问同步中的语句时,每一个线程会创建一个 ...

:)明白了 感谢
回复 使用道具 举报
张君 中级黑马 2013-3-28 15:09:32
7#
胡帅冰 发表于 2013-3-28 14:46
new Object()是创建了一个新的obj对象。如果在synchronized( )中new  object就是每次跑线程的时候,一个线 ...

:)明白了 感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马