在做项目的时候,遇到一个java.lang.IllegalMonitorStateException异常抛出,经过断点调试以及资料搜索,得知这个问题,是在于wait()和notify(),这两个等待的方法上,需synchronized加锁方法进行同步,如此这个问题就这么简单的解决了。一下代码是我遇到问题的示例:
没有synchronized加锁的情况,抛出该异常信息
public void get() { // 如果flag=false if (!flag) { try { this.wait();// 消费者等待 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // 若是有的情况下,则消费者进行其购买 System.out.println(this.num + this.type); // 如果flag为false,则已经卖完了 flag = false; // 则等待生产者生产线程 this.notify(); } }
加了synchronized的情况,得以解决
public synchronized void get() { // 如果flag=false,则表示没有包子 if (!flag) { try { this.wait();// 消费者等待 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // 若是有的情况下,则消费者进行其购买 System.out.println(this.num + this.type); // 如果flag为false,则已经卖完了 flag = false; // 则等待生产者生产线程 this.notify(); } }