也就是當前的線程不是此對象監視器的全部者。當前線程要鎖定該對象以後,才能用鎖定的對象執行這些方法,這裏須要用到synchronized關鍵字,鎖定哪一個對象就用哪一個對象來執行notify(), notifyAll(),wait(), wait(long), wait(long, int)操做,不然就會報IllegalMonitorStateException異常。java
1.鎖定方法的所屬的實例對象測試
public synchronized void method(){ //而後就能夠調用:this.notify()... //或者直接調用notify()... }
2.鎖定方法所屬的實例的classthis
public Class Test{ public static synchronized void method(){ //而後調用:Test.class.notify()... } }
3.鎖定其餘對象:線程
public Class Test{ public Object lock = new Object(); public static void method(){ synchronized (lock) { //須要調用 lock.notify(); } } }
測試: private Person person = new Person(); public void addProduct(){ synchronized (person){ try { //wait();//IllegalMonitorStateException //person.wait();//正常 Clerk.class.wait();//IllegalMonitorStateException } catch (InterruptedException e) { e.printStackTrace(); } } }
測試2: public class Clerk { //當前商品數量 private int product = 0; private static Person person = new Person(); public static synchronized void addProduct(){ try { //wait();//編譯報錯 // person.wait();//IllegalMonitorStateException //Person.class.wait();//IllegalMonitorStateException Clerk.class.wait();//正常 } catch (InterruptedException e) { e.printStackTrace(); } } }