• IllegalMonitorStateException异常原因及解决办法


     IllegalMonitorStateException异常发生是由于程序员没有注意notify(),notify(),wait()方法的使用条件,没有真正理解线程同步机制。如果当前的线程不是此对象锁的所有者,却调用该对象的notify(),notify(),wait()方法时抛出该异常。

    生产者线程

    public class Producer extends Thread{
     private Share shared;
     private int number;
     
     public Producer(Share s,int number){
      shared=s;
      this.number=number;
     }
     
     public void run(){
      for(int i=0;i<10;i++){
       shared.put(i);
       System.out.println("生产者"+this.number+" 输出的数据为:"+i);
       try{
        sleep((int)(Math.random()*100));
       }catch(InterruptedException e){}
      }
     }
    }

     共享资源对象

    public class Share{
     private int contents;
     private boolean available=false;
     
     public int get(){
      while(available==false){
       try{
        wait();
       }catch(InterruptedException e){}
      }
      available=false;
      notifyAll();
      return contents;
     }
     
     public void put(int value){
      while(available==true){
       try{
        wait();
       }catch(InterruptedException e){}
      }
      available=true;
      notifyAll();
      contents=value;
     }
    }

    消费者程序

    public class Consumer extends Thread{
     private Share shared;
     private int number;
     
     public Consumer(Share s,int number){
      shared=s;
      this.number=number;
     }
     
     public void run(){
      int value=0;
      for(int i=0;i<10;i++){
       value=shared.get();
       System.out.println("消费者"+this.number+" 得到的数据为:"+value);
      }
     }
    }

    主程序

    public class PCTest{
     public static void main (String[] args) {
      Share s=new Share();
      Producer p=new Producer(s,1);
      Consumer c=new Consumer(s,1);
      p.start();
      c.start();
            }
    }

    运行结果:

    E:Java>java PCTest
    生产者1 输出的数据为:0
    消费者1 得到的数据为:0
    Exception in thread "Thread-1" java.lang.IllegalMonitorStateException: current t
    hread not owner
            at java.lang.Object.wait(Native Method)
            at java.lang.Object.wait(Unknown Source)
            at Share.get(Share.java:8)
            at Consumer.run(Consumer.java:13)
    生产者1 输出的数据为:1
    Exception in thread "Thread-0" java.lang.IllegalMonitorStateException: current t
    hread not owner
            at java.lang.Object.wait(Native Method)
            at java.lang.Object.wait(Unknown Source)
            at Share.put(Share.java:18)
            at Producer.run(Producer.java:12)

    原因在于Share类中调用share对象的wait()方法时,不在同步方法或同步代码块中,因而当前线程并没有Share对象的锁,不能调用wait()方法。

    应改为:

    public class Share{
     private int contents;
     private boolean available=false;
     
     public synchronized int get(){
      while(available==false){
       try{
        wait();
       }catch(InterruptedException e){}
      }
      available=false;
      notifyAll();
      return contents;
     }
     
     public synchronized void put(int value){
      while(available==true){
       try{
        wait();
       }catch(InterruptedException e){}
      }
      available=true;
      notifyAll();
      contents=value;
     }
    }

    运行结果:

    IllegalMonitorStateException异常原因及解决办法 - 求是 - 求是的博客

    出处:http://blog.163.com/fan_yishan/blog/static/47692213200881981424126/
  • 相关阅读:
    bzoj3653: 谈笑风生
    bzoj1858: [Scoi2010]序列操作
    bzoj1857: [Scoi2010]传送带
    bzoj1856: [Scoi2010]字符串
    bzoj1855: [Scoi2010]股票交易
    bzoj1854: [Scoi2010]游戏
    bzoj1853: [Scoi2010]幸运数字
    斜堆,非旋转treap,替罪羊树
    NOI2003 文本编辑器
    A_star poj2449 k短路
  • 原文地址:https://www.cnblogs.com/dengshiwei/p/4258534.html
Copyright © 2020-2023  润新知