赞
踩
java.lang.IllegalMonitorStateException是在调用object的wait()、notify()、notifyAll()方法的时候可能会出现的异常。
在调用上述三个方法的时候,线程必须获得该对象的对象级别锁,换句话说,出现这个异常的原因是,调用wait()、notify()、notifyAll()的对象没有在同步方法(synchronized修饰的方法)或者同步代码块(synchronized(x){})中。想要获取该对象的对象级别锁,也就只有在同步方法或同步代码块中,这两个也是有区别的。
package com.example.demo.test; public class Demo { public static void main(String[] args) { Object lock = new Object(); Object lock2 = new Object(); // 正确写法 try { synchronized (lock) { lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { synchronized (lock) { lock.notifyAll(); } } // 错误写法示范1,原因:在调用notifyAll()方法的时候,锁对象没有在同步方法(synchronized修饰的方法)或者同步代码块(synchronized(x){})中 try { synchronized (lock) { lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.notifyAll(); } // 错误写法示范2,原因:锁对象是new Object(),不是lock,而且锁对象new Object()还是new的 try { synchronized (new Object()) { lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { synchronized (new Object()) { lock.notifyAll(); } } // 错误写法示范3,原因:调用wait()方法的是new Object(),而不是锁对象lock try { synchronized (lock) { new Object().wait(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { synchronized (lock) { lock.notifyAll(); } } // 错误写法示范4,原因:调用wait()方法的是lock2,而不是锁对象lock try { synchronized (lock) { lock2.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { synchronized (lock) { lock.notifyAll(); } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。