黑马程序员技术交流社区

标题: 麻烦给解释下,有点不明白多线程的小尾巴 [打印本页]

作者: 张君    时间: 2013-3-28 13:23
标题: 麻烦给解释下,有点不明白多线程的小尾巴
本帖最后由 张君 于 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();

}
}


作者: 梁耀今    时间: 2013-3-28 13:36
你这样子是使用不同的的锁了,因为run方法是线程调用的,如果你把锁放在里面,那就是相当于他们各自持有匿名锁。
作者: HM王琦    时间: 2013-3-28 13:43
如果在synchronized()中是new Object()是创建一个对象,当多线程访问同步中的语句时,每一个线程会创建一个Objcet,所以用的不是同一个锁。
而在synchronized()中是在外面创建的Objcet时,多线程用的就是同一个锁了,这时候线程是同步的。
作者: 胡帅冰    时间: 2013-3-28 14:46
new Object()是创建了一个新的obj对象。如果在synchronized( )中new  object就是每次跑线程的时候,一个线程新建一个obj的对象,这样的话obj对象就不是一个了,ynchronized( )是需要同一个对象才能同步的。在外面Object obj = new Object(),再传入synchronized( )中,只创建了一个对象,每一个线程调用run方法的时候使用的是同一个对象,就可以实现同步了。

作者: 张君    时间: 2013-3-28 15:08
梁耀今 发表于 2013-3-28 13:36
你这样子是使用不同的的锁了,因为run方法是线程调用的,如果你把锁放在里面,那就是相当于他们各自持有匿 ...

:)明白了 感谢
作者: 张君    时间: 2013-3-28 15:09
HM王琦 发表于 2013-3-28 13:43
如果在synchronized()中是new Object()是创建一个对象,当多线程访问同步中的语句时,每一个线程会创建一个 ...

:)明白了 感谢
作者: 张君    时间: 2013-3-28 15:09
胡帅冰 发表于 2013-3-28 14:46
new Object()是创建了一个新的obj对象。如果在synchronized( )中new  object就是每次跑线程的时候,一个线 ...

:)明白了 感谢




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