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