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

© Destiny 中级黑马   /  2012-3-17 10:03  /  2317 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程通信那块  看到毕老师直接把r放进synchronized()里面,有点不明白 ,哪位能给我细说下呢?
  1. class Res
  2. {
  3.         String name;
  4.         String sex;
  5.         boolean flag = false;
  6. }

  7. class Input implements Runnable
  8. {
  9.         private Res r ;
  10.         Input(Res r)
  11.         {
  12.                 this.r = r;
  13.         }
  14.         public void run()
  15.         {
  16.                 int x = 0;
  17.                 while(true)
  18.                 {
  19.                         synchronized(r)
  20.                         {

  21.                                 if(r.flag)
  22.                                         try{r.wait();}catch(Exception e){}
  23.                                 if(x==0)
  24.                                 {
  25.                                         r.name="mike";
  26.                                         r.sex="man";
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         r.name="丽丽";
  31.                                         r.sex = "女女女女女";
  32.                                 }
  33.                                 x = (x+1)%2;
  34.                                 r.flag = true;
  35.                                 r.notify();
  36.                         }
  37.                 }
  38.         }
  39. }

  40. class Output implements Runnable
  41. {
  42.         private Res r ;
  43.        
  44.         Output(Res r)
  45.         {
  46.                 this.r = r;
  47.         }
  48.         public void run()
  49.         {
  50.                 while(true)
  51.                 {
  52.                         synchronized(r)
  53.                         {
  54.                                 if(!r.flag)
  55.                                         try{r.wait();}catch(Exception e){}
  56.                                 System.out.println(r.name+"...."+r.sex);
  57.                                 r.flag = false;
  58.                                 r.notify();
  59.                         }
  60.                 }
  61.         }
  62. }


  63. class  InputOutputDemo
  64. {
  65.         public static void main(String[] args)
  66.         {
  67.                 Res r = new Res();

  68.                 Input in = new Input(r);
  69.                 Output out = new Output(r);

  70.                 Thread t1 = new Thread(in);
  71.                 Thread t2 = new Thread(out);

  72.                 t1.start();
  73.                 t2.start();
  74.         }
  75. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

5 个回复

倒序浏览
因为两个线程需要同一个锁,r只有一个对象。所以就把  r 当锁传进去了
回复 使用道具 举报
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
这边只创建了一个Res对象,然后将这个对象当参数传递给两个类,这两个类实际都是用这一个对象当锁。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
要实现同步,多个线程使用的必须是同一把锁,而同步代码块所需对象是任意的,这里仅仅是为了方便而用"r"作为对象传进来,因为在你代码中"r"是唯一的
回复 使用道具 举报
一般情况下同步使用的锁都是this,函数需要被对象调用,那么函数都有一个所属对象引用,就是this。
如果都把this放在同步锁的位置,在第一个同步中this指Input,而在第二个同步中this指Output,这样就不满足同步的前提之一:
使用同一个锁。故锁就不能使用this了
为了保证锁的唯一性,你可以使用Res.class,Input.class,Output.class,InputOutputDemo.class 这四个任意一个作为锁,因为它们是唯一的
考虑到该程序中r对象也是唯一的,简便起见就使用r作为锁放在synchronized()里面,也就是说在这里可以作为锁的不止一个,而r是最简单的一个
这样解释希望你明白

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
刘元明 发表于 2012-3-17 11:22
一般情况下同步使用的锁都是this,函数需要被对象调用,那么函数都有一个所属对象引用,就是this。
如果都 ...

嗯  基本上明白啦 谢谢你哈 很详细
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马