java併發編程--ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue

ConcurrentHashMap

  ConcurrentHashMap是HashMap在併發環境下的版本,大家可能要問,既然已經可以通過Collections.synchronizedMap獲得線程安全的映射型容器,爲什麼還需要ConcurrentHashMap呢?因爲通過Collections工具類獲得的線程安全的HashMap會在讀寫數據時對整個容器對象上鎖,這樣其他使用該容器的線程無論如何也無法再獲得該對象的鎖,也就意味着要一直等待前一個獲得鎖的線程離開同步代碼塊之後纔有機會執行。實際上,HashMap是通過哈希函數來確定存放鍵值對的桶(桶是爲了解決哈希衝突而引入的),修改HashMap時並不需要將整個容器鎖住,只需要鎖住即將修改的“桶”就可以了。HashMap的數據結構如下圖所示。 
這裏寫圖片描述

  此外,ConcurrentHashMap還提供了原子操作的方法,如下所示:

  • putIfAbsent:如果還沒有對應的鍵值對映射,就將其添加到HashMap中。
  • remove:如果鍵存在而且值與當前狀態相等(equals比較結果爲true),則用原子方式移除該鍵值對映射
  • replace:替換掉映射中元素的原子操作

CopyOnWriteArrayList

  CopyOnWriteArrayList是ArrayList在併發環境下的替代品。CopyOnWriteArrayList通過增加寫時複製語義來避免併發訪問引起的問題,也就是說任何修改操作都會在底層創建一個列表的副本,也就意味着之前已有的迭代器不會碰到意料之外的修改。這種方式對於不要嚴格讀寫同步的場景非常有用,因爲它提供了更好的性能。記住,要儘量減少鎖的使用,因爲那勢必帶來性能的下降(對數據庫中數據的併發訪問不也是如此嗎?如果可以的話就應該放棄悲觀鎖而使用樂觀鎖),CopyOnWriteArrayList很明顯也是通過犧牲空間獲得了時間(在計算機的世界裏,時間和空間通常是不可調和的矛盾,可以犧牲空間來提升效率獲得時間,當然也可以通過犧牲時間來減少對空間的使用)。 
這裏寫圖片描述

Queue

  隊列是一個無處不在的美妙概念,它提供了一種簡單又可靠的方式將資源分發給處理單元(也可以說是將工作單元分配給待處理的資源,這取決於你看待問題的方式)。實現中的併發編程模型很多都依賴隊列來實現,因爲它可以在線程之間傳遞工作單元。 
  Java 5中的BlockingQueue就是一個在併發環境下非常好用的工具,在調用put方法向隊列中插入元素時,如果隊列已滿,它會讓插入元素的線程等待隊列騰出空間;在調用take方法從隊列中取元素時,如果隊列爲空,取出元素的線程就會阻塞。 
這裏寫圖片描述 


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