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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 垂天云 高级黑马   /  2013-9-2 09:34  /  998 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 垂天云 于 2013-9-2 15:50 编辑
  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(Input.class)
  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. Output(Res r)
  44. {
  45. this.r = r;
  46. }
  47. public void run()
  48. {
  49. while(true)
  50. {
  51. synchronized(Input.class)//毕老师说锁可以为Input.class,可是这个字节码锁不应该是静态才可以的吗,我运行后报错信息见截图。
  52. {
  53. if(!r.flag)
  54. try{r.wait();}catch(Exception e){}
  55. System.out.println(r.name+"...."+r.sex);
  56. r.flag = false;
  57. r.notify();
  58. }
  59. }
  60. }
  61. }


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

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

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

  71. t1.start();
  72. t2.start();
  73. }
  74. }
复制代码
问题请见代码中的注释:

问题截图:

QQ截图20130902093344.jpg (38.1 KB, 下载次数: 12)

报错截图

报错截图

评分

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

查看全部评分

2 个回复

倒序浏览
哥们,把in.notify()都改成input.class.notify();因为此方法是唤醒在对象锁等待的线程,此方法应该由持有所的对象来调,其它对象无此权力,你用的同步代码块来加锁。持有锁的对象为input.class。所以要用input.class来调用。另外用同步代码块的锁对象可以是任意对象。不一定是input.class。wait()方法同理,都要改成锁对象来调用。
回复 使用道具 举报
影响力147753321 发表于 2013-9-2 15:26
哥们,把in.notify()都改成input.class.notify();因为此方法是唤醒在对象锁等待的线程,此方法应该由持有所 ...

明白了,非常谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马