第一篇:併發容器學習開篇介紹

摘要

Java併發包(concurrent)是Java用來處理併發問題的利器,該併發包中主要有原子類,鎖(lock),併發容器類等等。本系列博客主要就是介紹併發包中一些常用的併發容器,常用的類。那麼就讓我們一起來揭開併發包的面紗吧。

環境

基於JDK1.8

原子類

首先登場的就是我們的原子類。啥是原子類?原子類用啥用?
第一個問題,啥是原子類:操作具有原子性的類,我們稱之爲原子類。爲啥要有原子類呢?
原子類是爲了保證操作的原子性。例如:long i=0; i=i+1(i爲全局變量),在多線程的環境下,就有線程安全的問題,因爲,i=i+1這個操作分爲三條CPU指令執行。指令執行完之後會發生指令切換,造成可見性問題。但是,如果我們使用AtomicLong類來包裝i,然後調用getAndIncrement()方法(該方法是具有原子性的),則可以保證其安全性。

 AtomicLong atest = new AtomicLong(0);
 atest.getAndIncrement();

原子類主要有如下幾個:
在這裏插入圖片描述

原子類說完了,我們接着來說說鎖,我們都知道Java中synchronized關鍵字作爲同步鎖,同時,在併發包中還提供了Lock鎖。關於Lock與synchronized的區別後面會有說到。鎖的類圖如下:
在這裏插入圖片描述

併發容器

簡單的說完了鎖,我們接着來看重頭戲併發容器。雖然,Java中提供了同步容器Vector和Collections包裝的容器。但是同步容器最大的問題就是性能太差。因爲其是直接對添加元素,刪除元素,讀取元素的所有方法都加鎖。
所有在併發包中提供了併發容器,併發容器的實現後面我們在闡述。
我們先看看有哪些併發容器。
按照數據結構類型分類來看。

List接口下

List 接口下有CopyOnWriteArrayList實現類。其實現是內部維護了一個數組,成員變量array就指向這個內部數組,讀操作都是基於array進行的,寫操作的話,
CopyOnWriteArrayList會將array複製一份,然後,在新複製處理的數組上執行增加元素的操作。執行完之後再將array指向這個新的數組。僅僅適用於寫操作非常少的場景,而且能夠容忍讀寫的短暫不一致的情況。

Map接口下

Map 接口下有ConcurrentHashMap和ConcurrentSkipListMap。ConcurrentHashMap內部的數據結構跟HashMap一致,都是數組+鏈表+紅黑樹的結構。ConcurrentSkipListMap內部的數據結構則是數組+跳錶的數組結構。

集合類 Key Value 是否線程安全
HashMap 允許爲null 允許爲null
TreeMap 不允許爲空 允許爲null
Hashtable 不允許爲null 不允許爲null
ConcurrentHashMap 不允許爲null 不允許爲null
ConcurrentSkipListMap 不允許爲null 不允許爲null

Set接口下

Set接口下面有ConcurrentSkipListSet和CopyOnWriteArraySet兩個併發類。

Queue接口下

Queue接口下的併發容器類比較多,阻塞隊列BlockingQueue接口下有
單端堵塞隊列ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,LinkedTransferQueue,PriorityBlockingQueue,DelayQueue,雙端阻塞隊列LinkedBlockingDeque。非阻塞隊列有:單端隊列ConcurrentLinkedQueue,雙端隊列:ConcurrentLinkedDeque。

後續博客的提綱

  1. 第一篇:併發容器的學習開篇介紹
  2. 第二篇:原子類的說明與使用
  3. 第三篇:Lock的學習與使用
  4. 第四篇:走近CopyOnWriteArrayList
  5. 第五篇:HashMap的源碼分析
  6. 第六篇:走近ConcurrentHashMap(JDK1.8)
  7. 第七篇:ConcurrentHashMap(JDK1.8)擴容的詳細介紹以及多線程測試
  8. 第八篇:鏈表的學習:鏈表的頭插法和尾插法
  9. 第九篇:隊列的學習,用數組和鏈表實現單向隊列
  10. 第十篇:隊列的學習,循環隊列,阻塞隊列和併發隊列
  11. 第十一篇 隊列的學習(三) 手寫一個阻塞隊列
  12. 第十二篇:ArrayBlockingQueue的源碼解析
  13. 第十三篇:LinkedBlockingQueue的源碼解析(基於JDK1.8)
  14. 第十四篇:ConcurrentLinkedQueue的源碼解析
  15. 第十五篇:LinkedBlockingDeque的源碼解析(基於JDK1.8)

總結

本文簡單概述了Java併發包下的一些常用的類。後續的博客將圍繞着這些類來剖析。

發佈了144 篇原創文章 · 獲贊 24 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章