我們先簡單說下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關鍵字加在代碼塊上時,只是鎖住了這個代碼塊,方法內部的非同步代碼塊就沒有上鎖,所以說同步代碼塊範圍小,限制也就相對小,可以更精確的控制衝突限制訪問區域,所以相對來說高效。