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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何超 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 寻丶丶觅 于 2013-11-8 18:43 编辑

表示没懂 老毕也是在run方法中同步,不过如果你锁用Object对象的话 不要写在方法区中,这样是每个线程进来各拿一把锁
回复 使用道具 举报
童鞋,这个while(true)表示无限循环,不加也可以的,加了能让你更加直观的看出结果
你也可以直接在那个代码里面加同步啊,提取出来是优化后的结果,我记得专门有个视频是在将优化的
回复 使用道具 举报
synchronized(obj)
{
   show();
}

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




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

是一样的结果,只不过是写法不同
回复 使用道具 举报
是一样的,那是对代码的优化
回复 使用道具 举报
呃 老毕视频里两种都有说吧 而且是先说在run方法里面写同步代码块的 然后用同步函数来验证锁是this 刚才刚看到这里 这两种情况都是一样的 没区别
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马