微軟在設計基本框架時充分考慮了執行緒同步的問題,其結果就是clr為每乙個堆內物件都提供了支援執行緒同步的功能,這是同步機制的雛形。但是對每個堆內物件都分配同步塊有乙個較大的弊端,就是這樣增大了記憶體的消耗。在一般的系統中,需要同步機制支援的物件可能只佔少數,這樣對於大多數物件來說,乙個同步塊的記憶體消耗就完全被浪費了。
鑑於這一點,clr採用了一種折中的辦法,就是實際只為每個堆內物件分配乙個同步索引,該索引中只儲存乙個表明陣列內索引的整數。clr在載入時會新建乙個同步塊陣列,當某個物件需要被同步時,clr會為其分配乙個同步塊,並且把該同步塊在同步塊陣列中的索引加入該物件的同步塊索引中。圖7.5展示了這一機制的實現。
同步塊機制包含如下的幾點:
· 在clr被載入時初始化同步塊陣列。
· 每乙個被分配在堆上的物件都會包含兩個額外的字段,其中乙個儲存型別指標,而另外乙個就是同步塊索引,初始時被賦值為-1。
· 當乙個執行緒試圖使用該物件進入同步時,會檢查該物件的同步索引。如果索引為負數,則會在同步塊陣列中尋找或者新建乙個同步塊,並且把同步塊的索引值寫入該物件的同步索引中。如果該物件的同步索引不為負值,則找到該物件的同步塊並且檢查是否有其他執行緒在使用該同步塊,如果有則進入等待狀態,如果沒有則申明使用該同步塊。
· 當乙個物件退出同步時,該物件的同步索引被賦值為-1,並且對應的同步塊陣列內的同步塊被視為不再使用。
進入同步和退出同步,指的是呼叫system.threading.monitor的enter方法和exit方法,現在一般使用lock關鍵字。
注意:負責為物件分配同步塊並且賦值同步塊索引的執行緒本身是執行緒安全的。
結論:同步塊是指clr維護的同步塊陣列中的某個元素,負責提供執行緒同步的操作,當某個執行緒擁有了某個同步塊時,其他執行緒就在試圖訪問該同步塊時進入等待狀態。同步索引是每個堆內物件都會分配的乙個字段。
JAVA 同步監視器 同步塊和同步監視方法
同步監視器 監視器可以看作是包含乙個特殊房間的建築物。這個特殊的房間一次只能容納乙個客戶 執行緒 這個房間通常包含一些資料和 如果客戶想要占用這個特殊的房間,他必須先進入走廊 入口 等待。排程程式將選擇乙個基於一些標準 例如。先進先出 如果他因為某種原因被停職,他將被送到等候室,並安排稍後重新進入特...
同步塊與同步方法區別示例
示例 public class synctest public static void test1 catch interruptedexception e system.err.println system.err.println test1 public static synchronized ...
synchronized同步語句塊 一
用關鍵字synchronized宣告方法在某些情況下是有弊端的,比如a執行緒呼叫同步方法執行乙個長時間的任務,那麼b執行緒則必須等待較長時間。可以使用synchronized同步語句塊。public class nosysntest system.out.println sleep end thre...