zoukankan      html  css  js  c++  java
  • 关于IllegalMonitorStateException异常

    关于IllegalMonitorStateException异常:
    api中的解释
    public class IllegalMonitorStateExceptionextends RuntimeException

    抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 



    从以下版本开始: 
    JDK1.
    0 
    另请参见: 
    Object.notify(), Object.notifyAll(), Object.wait(), Object.wait(
    long), Object.wait(longint), 序列化表格
     也就是当前的线程不是此对象监视器的所有者。也就是要在当前线程锁定对象,才能用锁定的对象此行这些方法,需要用到synchronized ,锁定什么对象就用什么对象来执行
    notify(), notifyAll(),wait(), wait(long), wait(long, int)操作,否则就会报IllegalMonitorStateException异常。
    例如 :
    exapmle 1,锁定方法所属的实例对象:
    public synchronized void method(){
        //然后就可以调用:this.notify()...
        //或者直接调用notify()...
    }
    exapmle 2,锁定方法所属的实例的Class:
    public Class Test{
     public static synchronized void method(){
        //然后调用:Test.class.notify()...
     }
    }
    exapmle 3,锁定其他对象:
    public Class Test{
    public Object lock = new Object();
     public static void method(){
        synchronized (lock) {
         //需要调用 lock.notify();
        } 
     }
    }
    一个具体的例子如下:

    生产者线程

    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;
     }
    }

  • 相关阅读:
    乐字节-Java8核心特性实战-接口默认方法
    JavaScript简介和发展史,JavaScript组成和开发工具-乐字节
    乐字节-Java8新特性之Base64和重复注解与类型注解
    乐字节-Java8新特性之Date API
    乐字节-Java8新特性之Optional
    乐字节-Java8新特性-接口默认方法之Stream流(下)
    乐字节-Java8新特性之Stream流(上)
    乐字节-Java8新特性之方法引用
    乐字节-Java8新特性之函数式接口
    数字图像处理学习笔记之二 灰度变换与空间滤波
  • 原文地址:https://www.cnblogs.com/wangzehuaw/p/3658579.html
Copyright © 2011-2022 走看看