java 內建監視器

2021-08-01 04:22:23 字數 1477 閱讀 4707

監視器(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...