黑马程序员技术交流社区

标题: synchronized可以用在run()方法里面么,代码如下 [打印本页]

作者: 何超    时间: 2013-11-8 18:17
标题: synchronized可以用在run()方法里面么,代码如下
本帖最后由 何超 于 2013-11-8 22:03 编辑
  1. class Ticket implements Runnable
  2. {
  3.         private tick=10;
  4.         public void run()
  5.         {
  6.                 while(true)
  7.                 {
  8.                         if(tick>0)
  9.                         { System.out.println("Thread.currentThread().getName()"+tick);}
  10.                 }
  11.         }
  12. }
  13. class TicketDemo2
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Ticket t=new Ticket();
  18.                 Thread t1=new Thread(t);
  19.                 Thread t2=new Thread(t);
  20.                 Thread t3=new Thread(t);
  21.                 Thread t4=new Thread(t);
  22.                 t1.start();
  23.                 t2.start();
  24.                 t3.start();
  25.                 t4.start();
  26.         }
  27. }
复制代码
现在要对线程进行同步,毕老师的方法是把while中的语句提出来重新建立一个方法实现 然后对那个方法进行同步
可是为什么不直接在 while语句里面对同步代码块进行同步呢
  1. Objcet obj=new Object();
  2. while(true)
  3. {
  4. synchronized(obj)
  5. {
  6. if(tick>0)
  7. { System.out.println("Thread.currentThread().getName()"+tick);}
  8. }
  9. }
复制代码

作者: 寻丶丶觅    时间: 2013-11-8 18:41
本帖最后由 寻丶丶觅 于 2013-11-8 18:43 编辑

表示没懂 老毕也是在run方法中同步,不过如果你锁用Object对象的话 不要写在方法区中,这样是每个线程进来各拿一把锁
作者: 只想要一盏灯    时间: 2013-11-8 19:05
童鞋,这个while(true)表示无限循环,不加也可以的,加了能让你更加直观的看出结果
你也可以直接在那个代码里面加同步啊,提取出来是优化后的结果,我记得专门有个视频是在将优化的
作者: hel    时间: 2013-11-8 19:59
synchronized(obj)
{
   show();
}

show()
{
  system.out.println("123")
}




synchronized(obj)
{
system.out.println("123")
}

是一样的结果,只不过是写法不同
作者: 明月几时有    时间: 2013-11-9 11:19
是一样的,那是对代码的优化
作者: ixiangfeng    时间: 2013-11-9 11:45
呃 老毕视频里两种都有说吧 而且是先说在run方法里面写同步代码块的 然后用同步函数来验证锁是this 刚才刚看到这里 这两种情况都是一样的 没区别




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