在做項目的時候,遇到一個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(); } }