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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葛旭东 中级黑马   /  2012-10-8 11:02  /  1628 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 葛旭东 于 2012-10-8 22:03 编辑


  1. <p style="line-height: 30px; text-indent: 2em;"></p>
复制代码
class Res{
        String name;
        String sex;
        boolean flag = false;
}
class InPut implements Runnable{
        private Res r;
        InPut(Res r){
                this.r = r;
        }
        public void run(){
                int x = 0 ,y = 1;
                while(y++<=50000){
                        synchronized(r){
                                if(r.flag)
                                        try{r.wait();}
                                catch(Exception e){}
                if(x==0){
                r.name = "Tom";
                r.sex = "Man";
                }
                else{
                            r.name = "丽丽";
                    r.sex = "女孩女孩";
                }
                        }
                x = (x+1)%2;
                r.flag = true;
                r.notify();
        }
        }
}
class OutPut implements Runnable{
private Res r;
        OutPut(Res r){
                this.r = r;
        }
        public void run(){
                int y = 1;
                while(y++<=50000){
                        synchronized(r){
                                if(!r.flag)
                                        try{r.wait();}
                                catch(Exception e){}
                System.out.println(r.name+"......"+r.sex);
                r.flag = false;
                r.notify();
                        }
                }
        }
}
public class InOutPutDemo {

        public static void main(String[] args) {
  
       Res r = new Res();
       new Thread(new InPut(r)).start();
       new Thread(new OutPut(r)).start();
               
        }

}


程序抛出java.lang.IllegalMonitorStateException异常,说明:当前线程不是此对象监视器的所有者;该如何解决?
为什么老毕视频中使用同一锁r的wait()、notify()是可以的呢?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
  1. package com.miniyou.day01;

  2. class Res{
  3.     String name;
  4.     String sex;
  5.     boolean flag = false;
  6. }
  7. class InPut implements Runnable{
  8.     private Res r;
  9.     InPut(Res r){
  10.             this.r = r;
  11.     }
  12.     public void run(){
  13.             int x = 0 ,y = 1;
  14.             while(y++<=50000){
  15.                     synchronized(r){
  16.                             if(r.flag)
  17.                                     try{r.wait();}
  18.                             catch(Exception e){}
  19.             if(x==0){
  20.             r.name = "Tom";
  21.             r.sex = "Man";
  22.             }
  23.             else{
  24.                         r.name = "丽丽";
  25.                 r.sex = "女孩女孩";
  26.             }
  27.                    // }将这个括号放到下面
  28.             x = (x+1)%2;
  29.             r.flag = true;
  30.             r.notify();}//notify不在同步方法或同步代码块中 所以会出现异常
  31.     }
  32.     }
  33. }
  34. class OutPut implements Runnable{
  35. private Res r;
  36.     OutPut(Res r){
  37.             this.r = r;
  38.     }
  39.     public void run(){
  40.             int y = 1;
  41.             while(y++<=50000){
  42.                     synchronized(r){
  43.                             if(!r.flag)
  44.                                     try{r.wait();}
  45.                             catch(Exception e){}
  46.             System.out.println(r.name+"......"+r.sex);
  47.             r.flag = false;
  48.             r.notify();
  49.                     }
  50.             }
  51.     }
  52. }
  53. public class InOutPutDemo {

  54.     public static void main(String[] args) {

  55.    Res r = new Res();
  56.    new Thread(new InPut(r)).start();
  57.    new Thread(new OutPut(r)).start();
  58.             
  59.     }

  60. }


复制代码
notify不在同步方法或同步代码块中 所以会出现异常

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢,你的代码阅读能力很强啊,我没注意到同步代码块放错位置了。
以后多多指教啊!!!
回复 使用道具 举报
葛旭东 发表于 2012-10-8 13:27
谢谢,你的代码阅读能力很强啊,我没注意到同步代码块放错位置了。
以后多多指教啊!!! ...

如果问题解决了,把帖子修改为已解决,谢谢配合
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马