同步容器 併發容器 阻塞佇列 雙端佇列

2021-09-08 18:13:28 字數 1426 閱讀 7696

一、同步容器

主要代表有vector和hashtable,以及collections.synchronized***等。

鎖的粒度為當前物件整體。

迭代器是及時失敗的,即在迭代的過程中發現被修改,就會丟擲concurrentmodificationexception。

二、併發容器

主要代表有concurrenthashmap、copyonwritearraylist、concurrentskiplistmap、concurrentskiplistset。

鎖的粒度是分散的、細粒度的,即讀和寫是使用不同的鎖。

迭代器具有弱一致性,即可以容忍併發修改,不會丟擲concurrentmodificationexception。

三、阻塞佇列

主要代表有linkedblockingqueue、arrayblockingqueue、priorityblockingqueue(comparable,comparator)、synchronousqueue。

提供了可阻塞的put和take方法,以及支援定時的offer和poll方法。

適用於生產者、消費者模式(執行緒池和工作佇列-executor),同時也是同步容器

四、雙端佇列

主要代表有arraydeque和linkedblockingdeque。

意義:正如阻塞佇列適用於生產者消費者模式,雙端佇列同樣適用與另一種模式,即工作密取。在生產者-消費者設計中,所有消費者共享乙個工作佇列,而在工作密取中,每個消費者都有各自的雙端佇列。

如果乙個消費者完成了自己雙端佇列中的全部工作,那麼他就可以從其他消費者的雙端佇列末尾秘密的獲取工作。具有更好的可伸縮性,這是因為工作者執行緒不會在單個共享的任務佇列上發生競爭

在大多數時候,他們都只是訪問自己的雙端佇列,從而極大的減少了競爭。當工作者執行緒需要訪問另乙個佇列時,它會從佇列的尾部而不是頭部獲取工作,因此進一步降低了佇列上的競爭。

適用於:網頁爬蟲等任務中

五、比較及適用場景

如果不需要阻塞佇列,優先選擇concurrentlinkedqueue;

如果需要阻塞佇列,佇列大小固定優先選擇arrayblockingqueue,佇列大小不固定優先選擇linkedblockingqueue;

如果需要對佇列進行排序,選擇priorityblockingqueue;

如果需要乙個快速交換的佇列,選擇synchronousqueue;

如果需要對佇列中的元素進行延時操作,則選擇delayqueue。

Deque雙端佇列容器

1 deque雙端佇列容器建立deque物件 可建立無任何元素的或者具有n個元素的或者具有n個元素的並賦初值的 include include include include include include include include include include include includ...

deque雙端佇列容器

c 中的stl還是比較有用的,尤其是在做科研實現演算法的時候,之前也有用過,但是沒怎麼系統地學過,因此最近找了本書,大致瀏覽了一下,葉志軍的那本 c stl開發技術導引 科普 入門性質的一本書,寫得比較淺 呵呵,勿噴 下面的內容大部分是摘自該書。deque雙端佇列容器 double ended qu...

queue雙端佇列容器

目錄 1.建立deque物件 2.插入元素 3.前向遍歷 1 以陣列方式遍歷 2 以前向迭代器的方式遍歷 4.反向遍歷 5.刪除元素 6.訪問元素 7.其他 標頭檔案 include dequed 建立沒有任何元素的deque物件 dequedd dequed 10 建立具有10個整型元素的dequ...