監視器(monitor)是乙個相互排斥且具備同步能力的物件。監視器中的乙個時間點上,只能有乙個執行緒執行乙個方法。執行緒通過獲取監視器上的鎖進入監視器,並且通過釋放鎖退出監視器。任意物件都可能是乙個監視器。一旦乙個執行緒鎖住物件,該物件就成為監視器。加鎖是通過在方法或塊上使用synchronized關鍵字來實現的。在執行同步方法或塊之前,執行緒必須獲得鎖。如果條件不適合執行緒繼續在監視器內執行,縣城可能在監視器中等待。可以對監視器呼叫wait()方法來釋放鎖,這樣其他的一些監視器中的執行緒就可以獲取它,也就有可能改變監視器中的狀態。當條件滿足時,另一線程可以呼叫notify()方法或notifyall()方法來通知乙個或所有的等待執行緒重新獲取鎖並且恢復執行。呼叫這些方法的模板如下圖所示:
wait()、notify()和notifyall()方法必須在這些方法的接收物件的同步方法或同步塊中呼叫。否則就會出現illeagalmonitorstateexception異常。
當呼叫wait()方法時,它終止執行緒同時釋放物件的鎖。當執行緒被通知之後重新啟動時,鎖就被重新自動獲取。
考慮典型的生產者與消費者的例子。假設使用緩衝區儲存整數。緩衝區的大小是受限的。緩衝區提供add(int)方法將乙個int值新增到緩衝區中,還提供remove()方法從緩衝區中取出值。
public
class
threaddemo10
}//生產者
class
productor
extends
thread
public
void run()
catch(exception e)
system.out.println("add: "+i+"");}}
}//消費者
class
consumer
extends
thread
public
void run()
catch(exception e)
system.out.println("remove: "+i);}}
}class
buffer
catch(exception e)
}list.add(n);
system.out.println("size: "+list.size());
this.notify();
}catch(exception e)}}
public
int remove()
catch(exception e)
}int i=list.remove(0);
this.notify();
return i;
}catch(exception e)
return -1;}}
}
Java併發 物件監視器
對於同步塊的實現使用了monitorenter和monitorexit指令,而同步方法則是依靠方法修飾符上的acc synchronized來完成的。無論採用哪種方式,其本質是對乙個物件的監視器進行獲取,而對這個獲取過程是排他的,也就是說同一時刻只能有乙個執行緒獲得到由synchronized所保護...
mysql 鎖監視器 MySQL鎖監視器
還在為看不懂何登成的加鎖處理分析文章感到羞愧嗎?還在因為何大師的筆誤,陷入深深的迷茫嗎?只要你擁有大於5.6.16版本的mysql,鎖監視器你值得擁有 快速入門 開啟set global innodb status output on set global innodb status output ...
mysql 鎖監視器 MySQL鎖監視器
標籤 還在為看不懂何登成的加鎖處理分析文章感到羞愧嗎?還在因為何大師的筆誤,陷入深深的迷茫嗎?只要你擁有大於5.6.16版本的mysql,鎖監視器你值得擁有 快速入門 開啟set global innodb status output on set global innodb status outp...