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

14個Java并發容器,你用過幾個?

開發 后端
不考慮多線程并發的情況下,容器類一般使用ArrayList、HashMap等線程不安全的類,效率更高。在并發場景下,常會用到ConcurrentHashMap、ArrayBlockingQueue等線程安全的容器類,雖然犧牲了一些效率,但卻得到了安全。

 前言

不考慮多線程并發的情況下,容器類一般使用ArrayList、HashMap等線程不安全的類,效率更高。在并發場景下,常會用到ConcurrentHashMap、ArrayBlockingQueue等線程安全的容器類,雖然犧牲了一些效率,但卻得到了安全。

上面提到的線程安全容器都在java.util.concurrent包下,這個包下并發容器不少,今天全部翻出來鼓搗一下。

僅做簡單介紹,后續再分別深入探索。

并發容器介紹

  • ConcurrentHashMap:并發版HashMap
  • CopyOnWriteArrayList:并發版ArrayList
  • CopyOnWriteArraySet:并發Set
  • ConcurrentLinkedQueue:并發隊列(基于鏈表)
  • ConcurrentLinkedDeque:并發隊列(基于雙向鏈表)
  • ConcurrentSkipListMap:基于跳表的并發Map
  • ConcurrentSkipListSet:基于跳表的并發Set
  • ArrayBlockingQueue:阻塞隊列(基于數組)
  • LinkedBlockingQueue:阻塞隊列(基于鏈表)
  • LinkedBlockingDeque:阻塞隊列(基于雙向鏈表)
  • PriorityBlockingQueue:線程安全的優先隊列
  • SynchronousQueue:讀寫成對的隊列
  • LinkedTransferQueue:基于鏈表的數據交換隊列
  • DelayQueue:延時隊列

1.ConcurrentHashMap 并發版HashMap

最常見的并發容器之一,可以用作并發場景下的緩存。底層依然是哈希表,但在JAVA 8中有了不小的改變,而JAVA 7和JAVA 8都是用的比較多的版本,因此經常會將這兩個版本的實現方式做一些比較(比如面試中)。

一個比較大的差異就是,JAVA 7中采用分段鎖來減少鎖的競爭,JAVA 8中放棄了分段鎖,采用CAS(一種樂觀鎖),同時為了防止哈希沖突嚴重時退化成鏈表(沖突時會在該位置生成一個鏈表,哈希值相同的對象就鏈在一起),會在鏈表長度達到閾值(8)后轉換成紅黑樹(比起鏈表,樹的查詢效率更穩定)。

2.CopyOnWriteArrayList 并發版ArrayList

并發版ArrayList,底層結構也是數組,和ArrayList不同之處在于:當新增和刪除元素時會創建一個新的數組,在新的數組中增加或者排除指定對象,最后用新增數組替換原來的數組。

適用場景:由于讀操作不加鎖,寫(增、刪、改)操作加鎖,因此適用于讀多寫少的場景。

局限:由于讀的時候不會加鎖(讀的效率高,就和普通ArrayList一樣),讀取的當前副本,因此可能讀取到臟數據。如果介意,建議不用。

看看源碼感受下:

 

14個Java并發容器,你用過幾個?

 

3.CopyOnWriteArraySet 并發Set

基于CopyOnWriteArrayList實現(內含一個CopyOnWriteArrayList成員變量),也就是說底層是一個數組,意味著每次add都要遍歷整個集合才能知道是否存在,不存在時需要插入(加鎖)。

適用場景:在CopyOnWriteArrayList適用場景下加一個,集合別太大(全部遍歷傷不起)。

4.ConcurrentLinkedQueue 并發隊列(基于鏈表)

基于鏈表實現的并發隊列,使用樂觀鎖(CAS)保證線程安全。因為數據結構是鏈表,所以理論上是沒有隊列大小限制的,也就是說添加數據一定能成功。

5.ConcurrentLinkedDeque 并發隊列(基于雙向鏈表)

基于雙向鏈表實現的并發隊列,可以分別對頭尾進行操作,因此除了先進先出(FIFO),也可以先進后出(FILO),當然先進后出的話應該叫它棧了。

6.ConcurrentSkipListMap 基于跳表的并發Map

SkipList即跳表,跳表是一種空間換時間的數據結構,通過冗余數據,將鏈表一層一層索引,達到類似二分查找的效果

 

14個Java并發容器,你用過幾個?

 

7.ConcurrentSkipListSet 基于跳表的并發Set

類似HashSet和HashMap的關系,ConcurrentSkipListSet里面就是一個ConcurrentSkipListMap,就不細說了。

8.ArrayBlockingQueue 阻塞隊列(基于數組)

基于數組實現的可阻塞隊列,構造時必須制定數組大小,往里面放東西時如果數組滿了便會阻塞直到有位置(也支持直接返回和超時等待),通過一個鎖ReentrantLock保證線程安全。

 

14個Java并發容器,你用過幾個?

 

乍一看會有點疑惑,讀和寫都是同一個鎖,那要是空的時候正好一個讀線程來了不會一直阻塞嗎?

答案就在notEmpty、notFull里,這兩個出自lock的小東西讓鎖有了類似synchronized + wait + notify的功能。傳送門 → 終于搞懂了

sleep/wait/notify/notifyAll

9.LinkedBlockingQueue 阻塞隊列(基于鏈表)

基于鏈表實現的阻塞隊列,想比與不阻塞的ConcurrentLinkedQueue,它多了一個容量限制,如果不設置默認為int最大值。

10.LinkedBlockingDeque 阻塞隊列(基于雙向鏈表)

類似LinkedBlockingQueue,但提供了雙向鏈表特有的操作。

11.PriorityBlockingQueue 線程安全的優先隊列

構造時可以傳入一個比較器,可以看做放進去的元素會被排序,然后讀取的時候按順序消費。某些低優先級的元素可能長期無法被消費,因為不斷有更高優先級的元素進來。

12.SynchronousQueue 數據同步交換的隊列

一個虛假的隊列,因為它實際上沒有真正用于存儲元素的空間,每個插入操作都必須有對應的取出操作,沒取出時無法繼續放入。

 

14個Java并發容器,你用過幾個?

 

可以看到,寫入的線程沒有任何sleep,可以說是全力往隊列放東西,而讀取的線程又很不積極,讀一個又sleep一會。輸出的結果卻是讀寫操作成對出現。

JAVA中一個使用場景就是

Executors.newCachedThreadPool(),創建一個緩存線程池。

 

14個Java并發容器,你用過幾個?

 

13.LinkedTransferQueue 基于鏈表的數據交換隊列

實現了接口TransferQueue,通過transfer方法放入元素時,如果發現有線程在阻塞在取元素,會直接把這個元素給等待線程。如果沒有人等著消費,那么會把這個元素放到隊列尾部,并且此方法阻塞直到有人讀取這個元素。和SynchronousQueue有點像,但比它更強大。

14.DelayQueue 延時隊列

可以使放入隊列的元素在指定的延時后才被消費者取出,元素需要實現Delayed接口。

總結

上面簡單介紹了JAVA并發包下的一些容器類,知道有這些東西,遇到合適的場景時就能想起有個現成的東西可以用了。想要知其所以然,后續還得再深入探索一番。

作者:Java架構師追風

來源:簡書

 

責任編輯:武曉燕 來源: 簡書
相關推薦

2024-09-11 16:34:38

語法糖Java語言

2019-10-09 08:24:33

爬蟲框架Python

2024-03-12 10:02:31

Python內存編程

2022-04-08 14:45:23

JavaScript框架/前端

2018-06-06 09:10:34

編程語言Python庫

2025-04-23 08:20:00

Linux性能監測命令

2018-07-18 09:12:05

開發者Java工具

2019-08-27 15:12:12

Linux操作系統Windows

2019-10-29 08:44:47

Java數據庫實體

2023-10-10 08:33:40

編程范式命令式編程

2021-04-15 11:28:55

微信技巧語言

2019-10-22 22:31:15

Python切片字符串

2022-07-04 11:39:21

并發容器同步容器機制

2018-05-24 14:15:06

Python 開源GitHub

2019-11-01 09:23:31

開源項目UI

2023-12-07 08:13:58

Java開發

2019-10-17 16:02:44

高并發緩存瀏覽器

2021-02-24 11:13:48

IDE工具代碼編輯器

2017-11-16 11:26:23

程序員習慣

2023-03-26 20:23:10

Java開源工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区网站 | 日韩综合色| 亚洲国产一区二区三区在线观看 | 久久国产精品视频 | 亚洲一区二区三区 | 国产伦精品一区二区三区四区视频 | 56pao在线 | 一区二区国产在线 | 日韩欧美在 | 久久精品亚洲成在人线av网址 | 丁香五月网久久综合 | 日本成人在线观看网站 | 操操日| 国产福利91精品 | 日韩中文字幕在线播放 | 欧美午夜激情在线 | 福利社午夜影院 | 在线观看成人小视频 | 欧美日韩久久精品 | 欧美日韩激情 | 北条麻妃一区二区三区在线视频 | 欧美一区| 五月综合久久 | 伊人春色在线 | 亚洲午夜精品视频 | 亚州午夜精品 | 国产夜恋视频在线观看 | 久草视频在线播放 | 国产欧美日韩精品一区 | 免费h视频 | 伊人伊成久久人综合网站 | 成人午夜免费在线视频 | 日韩成人免费在线视频 | 色av一区二区三区 | 亚洲人免费视频 | 色婷婷一区 | 欧美成人手机视频 | 性一区| 亚洲精品一区中文字幕乱码 | 亚洲精品一区在线 | 日韩一区中文字幕 |