關於ConcurrentHashMap的size的思考

	最近在學習關於java併發的一些知識,因此開通博客記錄整個過程,也算是督促一下自己
	ConcurrentHashMap我們都知道的是通過分段鎖來控制整個HashMap的安全性,那麼求ConcurrentHashMap在求size的時候是如何兼顧到性能以及安全性的呢?
如果只是逐個地獲取Segment,那麼有可能在後面獲取下一個Segment裏面的元素的個數的時候,上面一個Segment裏面元素的個數已經很可能改變了,因此最後累加到最後,有可能數據是錯誤的。如果從一開始就獲取所有Segment鎖的話,又會導致性能低下,因爲i你獲取了所有的鎖,那麼別的線程將無法對該HashMap執行任何操作。因此也是不可取的。
	那麼ConcurrentHashMap採用的是什麼措施呢?我們來看一段代碼:
	
	我們可以看到ConcurrentHashMap同時採用了這兩個方法,首先去遍歷兩遍是否在疊加每個Segment的時候,元素的總數會有增加,如果沒有增加的話,意味着我們的獲取的元素總數是正確的。如果兩次都有變化,那麼意味着有很大可能這個HashMap非常頻繁地執行add、remove操作,這個時候我們不得不採用獲取全部Segment鎖來獲取當前HashMap的元素的總數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章