JAVA 同步監視器 同步塊和同步監視方法

2021-09-24 16:31:47 字數 1359 閱讀 3518

同步監視器

監視器可以看作是包含乙個特殊房間的建築物。這個特殊的房間一次只能容納乙個客戶(執行緒)。這個房間通常包含一些資料和**。如果客戶想要占用這個特殊的房間,他必須先進入走廊(入口)等待。排程程式將選擇乙個基於一些標準(例如。先進先出)。如果他因為某種原因被停職,他將被送到等候室,並安排稍後重新進入特別室。簡單地說,監視器是監視執行緒對特定房間的訪問的工具。它確保只有乙個執行緒可以訪問受保護的資料或**。

同步塊

public void run() 

system.out.println( this.name + "吃第" + this.p.pack + "個包子" );

this.p.pack--;

}thread.sleep( 10 );

}} catch (interruptedexception e)

同步方法

public class 包子籠 

}

public void run() 

//這裡會出現吃到第0個包子,

//對與第乙個執行緒,他在判斷包子已經吃完,

//但是,在p--之前,執行時間用完了。

//該項成就就休眠了了。由於另外乙個執行緒繼續從頭執行,

//所以跳過了之前的p==0的判斷,而且p--已執行。

//就直接輸出當時p--後的結果了。

p.eat( this.name );

thread.sleep( 10 );

}} catch (interruptedexception e)

乙個執行緒執行到synchronized**時,會在加鎖的物件上,關聯乙個同步監視器

藍色空矩形為同步監視器,紅色為物件

紅色為同步監視器

執行緒進入同步區等於獲得物件的鎖,如果乙個執行緒進入同步區,其他執行緒不能進入,直到當前執行緒離開同步代(synchronized)釋放鎖,其他物件才能進入乙個執行緒也可能執行wait()進入等待區,釋放鎖,其他執行緒執行進入同步區並向等待區的執行緒發通知

等待區可以有多個執行緒在等待,同步區執行緒發通知應該全部發,入口和等待區的執行緒都應該受到通知。有監視器才有等待區

等待和通知方法必須通過加鎖物件呼叫。

同步塊和同步塊索引

微軟在設計基本框架時充分考慮了執行緒同步的問題,其結果就是clr為每乙個堆內物件都提供了支援執行緒同步的功能,這是同步機制的雛形。但是對每個堆內物件都分配同步塊有乙個較大的弊端,就是這樣增大了記憶體的消耗。在一般的系統中,需要同步機制支援的物件可能只佔少數,這樣對於大多數物件來說,乙個同步塊的記憶體...

C 執行緒同步之排它鎖 Monitor監視器類

一 monitor類說明,提供同步訪問物件的機制。1.位於system.threading命名空間下,mscorlib.dll程式集中。2.monitor通過獲取和釋放排它鎖的方式實現多執行緒的同步問題。3.monitor實現當前程序內的多執行緒的同步,和lock語句的功能類似。4.當前為靜態類,使...

java 內建監視器

監視器 monitor 是乙個相互排斥且具備同步能力的物件。監視器中的乙個時間點上,只能有乙個執行緒執行乙個方法。執行緒通過獲取監視器上的鎖進入監視器,並且通過釋放鎖退出監視器。任意物件都可能是乙個監視器。一旦乙個執行緒鎖住物件,該物件就成為監視器。加鎖是通過在方法或塊上使用synchronized...