Java
并發包(concurrent
)是Java
用來處理并發問題的利器,該并發包中主要有原子類,鎖(lock
),并發容器類等等。本系列博客主要就是介紹并發包中一些常用的并發容器,常用的類。那么就讓我們一起來揭開并發包的面紗吧。
環境:
基于JDK1.8
1、原子類
首先登場的就是我們的原子類。啥是原子類?原子類用啥用?
第一個問題,啥是原子類:操作具有原子性的類,我們稱之為原子類。為啥要有原子類呢?
原子類是為了保證操作的原子性。例如:long i=0
; i=i+1
(i為全局變量),在多線程的環境下,就有線程安全的問題,因為,i=i+1
這個操作分為三條CPU指令執行。指令執行完之后會發生指令切換,造成可見性問題。但是,如果我們使用AtomicLong
類來包裝i,然后調用getAndIncrement()
方法(該方法是具有原子性的),則可以保證其安全性。
1
2
|
AtomicLong atest = new AtomicLong( 0 ); atest.getAndIncrement(); |
原子類主要有如下幾個:
2、鎖
原子類說完了,我們接著來說說鎖,我們都知道Java
中synchronized
關鍵字作為同步鎖,同時,在并發包中還提供了Lock鎖。關于Lock
與synchronized
的區別后面會有說到。
鎖的類圖如下:
3、并發容器
簡單的說完了鎖,我們接著來看重頭戲并發容器。雖然,
Java
中提供了同步容器Vector
和Collections
包裝的容器。但是同步容器最大的問題就是性能太差。因為其是直接對添加元素,刪除元素,讀取元素的所有方法都加鎖。
所有在并發包中提供了并發容器,并發容器的實現后面我們在闡述。
我們先看看有哪些并發容器。
按照數據結構類型分類來看。
4、List接口下
List
接口下有CopyOnWriteArrayList
實現類。其實現是內部維護了一個數組,成員變量array
就指向這個內部數組,讀操作都是基于array
進行的,寫操作的話,
CopyOnWriteArrayList
會將array
復制一份,然后,在新復制處理的數組上執行增加元素的操作。執行完之后再將array指向這個新的數組。僅僅適用于寫操作非常少的場景,而且能夠容忍讀寫的短暫不一致的情況。
5、Map接口下
Map
接口下有ConcurrentHashMap
和ConcurrentSkipListMap
。ConcurrentHashMap
內部的數據結構跟HashMap
一致,都是數組+鏈表+紅黑樹的結構。ConcurrentSkipListMap
內部的數據結構則是數組+跳表的數組結構。
6、Set接口下
Set接口下面有
ConcurrentSkipListSet
和CopyOnWriteArraySet
兩個并發類。
7、Queue接口下
Queue
接口下的并發容器類比較多,阻塞隊列BlockingQueue
接口下有
單端堵塞隊列:
-
ArrayBlockingQueue
-
LinkedBlockingQueue
-
SynchronousQueue
-
LinkedTransferQueue
-
PriorityBlockingQueue
-
DelayQueue
雙端阻塞隊列:LinkedBlockingDeque
非阻塞隊列有:單端隊列ConcurrentLinkedQueue
,雙端隊列:ConcurrentLinkedDeque
。
總結:
到此這篇關于Java并發容器介紹的文章就介紹到這了,更多相關Java并發容器內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://feige.blog.csdn.net/article/details/104041553