synchronizedMap源碼分析

我們先簡單說下HashMap和HashTable

之前學習集合的時候,說到過HashMap是線程不安全的,HashTable是線程安全的,但是HashTable在高併發情況下效率太低,爲什麼如此的低呢?是因爲HashTable爲了保證線程安全,給每個方法上都加了synchronized關鍵字才保證了線程安全

今天我們來學習用工具類Collections來創建線程安全的synchronizedMap,來看看這個工具類創建這個map有什麼特別之處?

用法源碼實例:

就是傳進一個map

我們進去看看:

原來synchronizedMap是Collections這個集合工具類的一個靜態內部類

我們發現,其中有一個Map屬性和一個mutex對象(不妨先叫它互斥鎖)

接着下面就是兩個構造函數:

第一個構造函數只傳入了一個map,對map進行初始化操作後,對於mutex互斥鎖是賦值爲調用synchronizedMap的對象

第二個除了傳入一個map還傳入了一個Object對象,當然,初始化時也把這個Object的對象賦值給mutex互斥鎖

最終要的我們再來看看下面:

在創建完synchronizedMap後,對map進行操作時,就會對該方法進行上鎖,實現線程安全。

1、當synchronized關鍵字加在方法上時,對整個方法進行了上鎖,相對來說,鎖的範圍大,所以性能就差

2、當synchronized關鍵字加在代碼塊上時,只是鎖住了這個代碼塊,方法內部的非同步代碼塊就沒有上鎖,所以說同步代碼塊範圍小,限制也就相對小,可以更精確的控制衝突限制訪問區域,所以相對來說高效。

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章