成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JDK并發編程類庫,有坑!!!

開發 前端
今天我們主要介紹了JDK1.5之后提供的并發容器,主要包括:List、Set、Map和Queue,而Queue又可以分為:單端阻塞隊列、雙端阻塞隊列、單端非阻塞隊列和雙端非阻塞隊列。對于每種并發容器,我們簡單介紹了其基本原理和注意事項。

大家好,我是冰河~~

在JDK1.5之前的線程安全的容器,大多數都是指同步容器,使用同步容器進行并發編程時,最大的問題就是性能很差。因為同步容器中的所有方法都是使用synchronized鎖進行互斥,串行度太高了,無法真正的做到并行。

所以,在JDK1.5之后,JDK中提供了并發性能更好的容器。JDK1.5及之后的版本中,提供的線程安全的容器,一般被稱為并發容器。

并發容器

與同步容器一樣,并發容器在總體上也可以分為四大類,分別為:List、Set、Map和Queue。總體上如下圖所示。

圖片

接下來,我們分別介紹下這些并發容器在使用時的注意事項和避免踩到的坑。

List

并發容器中的List相對來說比較簡單,就一個CopyOnWriteArrayList。大家可以從字面的意思中就能夠體會到:CopyOnWrite,在寫的時候進行復制操作,也就是說在進行寫操作時,會將共享變量復制一份。那這樣做有什么好處呢?最大的好處就是:讀操作可以做到完全無鎖化

在CopyOnWriteArrayList內部維護了一個數組,成員變量array指向這個數組,其核心源代碼如下所示。

private transient volatile Object[] array;
final Object[] getArray() {
 return array;
}
final void setArray(Object[] a) {
 array = a;
}

當進行操作時,都是基于array指向的這個內部數組進行的。例如,我們使用Iterator迭代器遍歷這個數組時,會按照下圖所示的方式進行讀操作。

圖片

如果在遍歷CopyOnWriteArrayList時發生寫操作,例如,向數組中增加一個元素時,CopyOnWriteArrayList則會將內部的數組復制一份出來,然后會在新復制出來的數組上添加新的元素,添加完再將array指向新的數組,如下圖所示。

圖片

對于CopyOnWriteArrayList的其他寫操作和添加元素的操作原理相同,這里就不再贅述了。

使用CopyOnWriteArrayList時需要注意的是:

  • CopyOnWriteArrayList只適合寫操作比較少的場景,并且能夠容忍讀寫操作在短時間內的不一致。
  • CopyOnWriteArrayList的迭代器是只讀的,不支持寫操作。

Set

對于Set接口來說,并發容器中主要有兩個實現類,一個是CopyOnWriteArraySet,另一個是ConcurrentSkipListSet。其中,CopyOnWriteArraySet的使用場景、原理與注意事項和CopyOnWriteArrayList一致。而ConcurrentSkipListSet的使用場景、原理和注意事項和下文的ConcurrentSkipListMap一致。這里,我就不再贅述啦。

Map

在并發容器中,Map接口的實現類主要有ConcurrentHashMap和ConcurrentSkipListMap,而ConcurrentHashMap和ConcurrentSkipListMap最大的區別就是:ConcurrentHashMap的Key是無序的,而ConcurrentSkipListMap的Key是有序的。

在使用ConcurrentHashMap和ConcurrentSkipListMap時,需要注意的是:ConcurrentHashMap和ConcurrentSkipListMap的Key和Value都不能為空。

這里,我們可以將Map相關的類總結成一個表格,如下所示。

Map的實現類

Key是否可為空

Value是否可為空

是否是線程安全的

HashMap




TreeMap




HashTable




ConcurrentHashMap




ConcurrentSkipListMap




這樣,大家記憶起來就方便多了。

這里,ConcurrentSkipListMap是基于“跳表”實現的,跳表的插入、刪除、查詢的平均時間復雜度為O(log n),這些時間復雜度在理論上與線程數沒有關系。如果要追求性能的話,可以嘗試使用ConcurrentSkipListMap。

Queue

在Java的并發容器中,Queue相對來說比較復雜。我們先來了解幾個概念:

  • 阻塞隊列:阻塞一般就是指當隊列已滿時,入隊操作會阻塞;當隊列為空時,出隊操作就會阻塞。
  • 非阻塞隊列:隊列的入隊和出隊操作不會阻塞。
  • 單端隊列:隊列的入隊操作只能在隊尾進行,隊列的出隊操作只能在隊首進行。
  • 雙端隊列:隊列的入隊操作和出隊操作都可以在隊首和隊尾進行。

我們可以將上述的隊列進行組合,將隊列分為單端阻塞隊列、雙端阻塞隊列、單端非阻塞隊列和雙端非阻塞隊列。

圖片

在Java的并發容器中,會使用明顯的標識來區分不同類型的隊列。

  • 阻塞隊列一個明顯的標識就是使用Blocking修飾,例如,ArrayBlockingQueue和LinkedBlockingQueue都是阻塞隊列。
  • 單端隊列會使用Queue標識,例如ArrayBlockingQueue和LinkedBlockingQueue也是單端隊列。
  • 雙端隊列會使用Deque標識,例如LinkedBlockingDeque和ConcurrentLinkedDeque都是雙端隊列。

接下來,我們就分別簡單聊聊這四種類型的隊列。

單端阻塞隊列

在Java的并發容器中,單端阻塞隊列的主要實現是BlockingQueue,主要包括:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferQueue、PriorityBlockingQueue和DelayQueue。

圖片

單端阻塞隊列的內部一般會有一個隊列。

在實現上,內部的隊列可以是數組,例如ArrayBlockingQueue,也可以是鏈表,例如LinkedBlockingQueue。

也可以在內部不存在隊列,例如SynchronousQueue,SynchronousQueue實現了生產者的入隊操作必須等待消費者的出隊操作完成之后才能進行。

LinkedTransferQueue集成了LinkedBlockingQueue和SynchronousQueue的優點,并且性能比LinkedBlockingQueue好。

PriorityBlockingQueue實現了按照優先級進行出隊操作,也就是說,隊列元素在PriorityBlockingQueue內部可以按照某種規則進行排序。

DelayQueue是延時隊列,實現了在一段時間后再出隊的操作。

雙端阻塞隊列

雙端阻塞隊列的實現主要是LinkedBlockingDeque。示意圖如下所示。

圖片

單端非阻塞隊列

單端非阻塞隊列的實現主要是ConcurrentLinkedQueue,示意圖如下所示。

圖片

雙端非阻塞隊列

雙端非阻塞隊列的實現主要是ConcurrentLinkedDeque,示意圖如下所示。

圖片

有界與無界隊列

使用隊列時,還要注意隊列的有界與無界問題,也就是在使用隊列時,需要注意隊列是否有容量限制。

在實際工作中,一般推薦使用有界隊列。因為無界隊列很容易導致內存溢出的問題。在Java的并發容器中,只有ArrayBlockingQueue和LinkedBlockingQueue支持有界,其他的隊列都是無界隊列。

在使用時,一定要注意內存溢出問題。

總結

今天我們主要介紹了JDK1.5之后提供的并發容器,主要包括:List、Set、Map和Queue,而Queue又可以分為:單端阻塞隊列、雙端阻塞隊列、單端非阻塞隊列和雙端非阻塞隊列。對于每種并發容器,我們簡單介紹了其基本原理和注意事項。

責任編輯:姜華 來源: 冰河技術
相關推薦

2025-01-24 14:35:10

2022-03-09 09:43:20

并發編程Java

2022-03-02 08:20:54

并發編程java后端開發

2009-07-09 17:58:15

MyEclipse配置JDK類庫源代碼

2022-10-12 07:53:46

并發編程同步工具

2023-07-04 13:36:00

同步工具類Phaser

2023-07-05 08:18:54

Atomic類樂觀鎖悲觀鎖

2023-07-03 09:59:00

并發編程并發容器

2023-01-18 23:20:25

編程開發

2023-01-06 16:36:09

編程效率語言

2017-09-19 14:53:37

Java并發編程并發代碼設計

2011-12-12 11:16:02

iOS并發編程

2022-10-17 08:07:13

Go 語言并發編程

2024-06-24 08:11:37

2023-06-06 07:45:30

JDK21Java并發編程

2023-07-06 08:06:47

LockCondition公平鎖

2011-12-29 13:31:15

Java

2021-08-05 07:58:22

并發編程包Task

2025-02-17 00:00:25

Java并發編程

2025-02-19 00:05:18

Java并發編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区av | 韩日在线视频 | 中文字幕国产精品 | 91精品久久久久久综合五月天 | 日本黄色片免费在线观看 | www.日本精品 | 天天干com| 一区视频| 国产在线97 | 日韩电影免费观看中文字幕 | 日韩亚洲欧美一区 | 成人一区二区三区在线观看 | 精品国产视频 | 99精品国产一区二区青青牛奶 | 99小视频| 午夜三区 | 午夜国产在线 | 亚洲 欧美 另类 日韩 | 久草新视频 | 日韩在线免费视频 | 国产一级片网站 | 成人高清在线视频 | 在线a视频网站 | 亚洲免费在线 | 日韩午夜精品 | 精久久久久 | 日韩国产中文字幕 | 这里只有精品99re | 国产精品亚洲欧美日韩一区在线 | 中文字幕在线一区二区三区 | 国产高清精品一区二区三区 | 九色在线观看 | 在线观看国产视频 | 欧美老少妇一级特黄一片 | 国产亚洲欧美日韩精品一区二区三区 | 国产一区二区在线免费观看 | 欧美中文字幕一区 | 欧美一级二级在线观看 | 亚洲一二三视频 | 精品中文字幕在线 | 亚洲三区在线观看 |