Java並發容器介紹

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

環境:

基於JDK1.8

1、原子類

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

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

原子類主要有如下幾個:

2、鎖

原子類說完瞭,我們接著來說說鎖,我們都知道Javasynchronized關鍵字作為同步鎖,同時,在並發包中還提供瞭Lock鎖。關於Locksynchronized的區別後面會有說到。

鎖的類圖如下:

3、並發容器

簡單的說完瞭鎖,我們接著來看重頭戲並發容器。雖然,Java中提供瞭同步容器VectorCollections包裝的容器。但是同步容器最大的問題就是性能太差。因為其是直接對添加元素,刪除元素,讀取元素的所有方法都加鎖。
所有在並發包中提供瞭並發容器,並發容器的實現後面我們在闡述。

我們先看看有哪些並發容器。
按照數據結構類型分類來看。

4、List接口下

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

5、Map接口下

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

6、Set接口下

Set接口下面有ConcurrentSkipListSetCopyOnWriteArraySet兩個並發類。

7、Queue接口下

Queue接口下的並發容器類比較多,阻塞隊列BlockingQueue接口下有

單端堵塞隊列:

  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • SynchronousQueue
  • LinkedTransferQueue
  • PriorityBlockingQueue
  • DelayQueue

雙端阻塞隊列:LinkedBlockingDeque

非阻塞隊列有:單端隊列ConcurrentLinkedQueue雙端隊列ConcurrentLinkedDeque

總結:

到此這篇關於Java並發容器介紹的文章就介紹到這瞭,更多相關Java並發容器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: