摘要
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。
後續博客的提綱
- 第一篇:併發容器的學習開篇介紹
- 第二篇:原子類的說明與使用
- 第三篇:Lock的學習與使用
- 第四篇:走近CopyOnWriteArrayList
- 第五篇:HashMap的源碼分析
- 第六篇:走近ConcurrentHashMap(JDK1.8)
- 第七篇:ConcurrentHashMap(JDK1.8)擴容的詳細介紹以及多線程測試
- 第八篇:鏈表的學習:鏈表的頭插法和尾插法
- 第九篇:隊列的學習,用數組和鏈表實現單向隊列
- 第十篇:隊列的學習,循環隊列,阻塞隊列和併發隊列
- 第十一篇 隊列的學習(三) 手寫一個阻塞隊列
- 第十二篇:ArrayBlockingQueue的源碼解析
- 第十三篇:LinkedBlockingQueue的源碼解析(基於JDK1.8)
- 第十四篇:ConcurrentLinkedQueue的源碼解析
- 第十五篇:LinkedBlockingDeque的源碼解析(基於JDK1.8)
總結
本文簡單概述了Java併發包下的一些常用的類。後續的博客將圍繞着這些類來剖析。