同步容器、併發容器、阻塞佇列、雙端佇列與工作密取
在多執行緒的開發中經常會碰到資料的併發修改,併發存取,因此正確的使用不同的容器很關鍵,直接影響到資料的正確性。下面主要記錄下三種重要的佇列,以及一種非常使用的雙端佇列。
1、同步容器
主要代表有Vector和Hashtable,以及Collections.synchronizedXxx等。
鎖的粒度為當前物件整體。
迭代器是及時失敗的,即在迭代的過程中發現被修改,就會丟擲ConcurrentModificationException。
2、併發容器
主要代表有ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentSkipListMap、ConcurrentSkipListSet
鎖的粒度是分散的、細粒度的,即讀和寫是使用不同的鎖。
迭代器具有弱一致性,即可以容忍併發修改,不會丟擲ConcurrentModificationException。
3、阻塞佇列
主要代表有LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue(Comparable,Comparator)、SynchronousQueue。
提供了可阻塞的put和take方法,以及支援定時的offer和poll方法。
適用於生產者、消費者模式(執行緒池和工作佇列-Executor)
同時也是同步容器
4、雙端佇列和工作密取
主要代表有ArrayDeque和LinkedBlockingDeque。
意義:正如阻塞佇列適用於生產者消費者模式,雙端佇列同樣適用與另一種模式,即工作密取。在生產者-消費者設計中,所有消費者共享一個工作佇列,而在工作密取中,每個消費者都有各自的雙端佇列。
如果一個消費者完成了自己雙端佇列中的全部工作,那麼他就可以從其他消費者的雙端佇列末尾祕密的獲取工作。具有更好的可伸縮性,這是因為工作者執行緒不會在單個共享的任務佇列上發生競爭。
在大多數時候,他們都只是訪問自己的雙端佇列,從而極大的減少了競爭。當工作者執行緒需要訪問另一個佇列時,它會從佇列的尾部而不是頭部獲取工作,因此進一步降低了佇列上的競爭。
適用於:網頁爬蟲等任務中
相關文章
- Java併發佇列與容器Java佇列
- 聊聊併發(四)——阻塞佇列佇列
- 佇列、阻塞佇列佇列
- 單調佇列雙端佇列佇列
- Java併發——阻塞佇列集(下)Java佇列
- Java併發——阻塞佇列集(上)Java佇列
- 雙端佇列佇列
- 併發佇列ConcurrentLinkedQueue和阻塞佇列LinkedBlockingQueue用法佇列BloC
- 圖解--佇列、併發佇列圖解佇列
- 阻塞佇列一——java中的阻塞佇列佇列Java
- JAVA併發之阻塞佇列淺析Java佇列
- Java併發系列 — 阻塞佇列(BlockingQueue)Java佇列BloC
- Java併發程式設計:阻塞佇列Java程式設計佇列
- Java併發程式設計——阻塞佇列Java程式設計佇列
- STL(十九)queue佇列容器佇列
- 阻塞佇列佇列
- 『併發包入坑指北』之阻塞佇列佇列
- Java併發6:阻塞佇列,Fork/Join框架Java佇列框架
- Android併發學習之阻塞佇列Android佇列
- synchronized 中的同步佇列與等待佇列synchronized佇列
- 佇列-單端佇列佇列
- GCD 併發佇列GC佇列
- python資料結構與演算法——棧、佇列與雙端佇列Python資料結構演算法佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- 死磕阻塞佇列佇列
- 阻塞佇列 BlockingQueue佇列BloC
- 面經手冊 · 第9篇《佇列是什麼?什麼是雙端佇列、延遲對列、阻塞佇列,全是知識盲區!》佇列
- iOS 多執行緒--GCD 序列佇列、併發佇列以及同步執行、非同步執行iOS執行緒GC佇列非同步
- 佇列的併發使用佇列
- java併發程式設計工具類JUC第七篇:BlockingDeque雙端阻塞佇列Java程式設計BloC佇列
- Java併發指南11:解讀 Java 阻塞佇列 BlockingQueueJava佇列BloC
- 【Java 併發筆記】7 種阻塞佇列相關整理Java筆記佇列
- 阻塞佇列--LinkedBlockingQueue佇列BloC
- Java中的阻塞佇列Java佇列
- 阻塞佇列——四組API佇列API
- 延遲阻塞佇列 DelayQueue佇列
- Redis 應用-非同步訊息佇列與延時佇列Redis非同步佇列
- 計算機程式的思維邏輯 (76) - 併發容器 - 各種佇列計算機佇列