同步容器、併發容器、阻塞佇列、雙端佇列與工作密取

chaofanwei發表於2014-03-23

        在多執行緒的開發中經常會碰到資料的併發修改,併發存取,因此正確的使用不同的容器很關鍵,直接影響到資料的正確性。下面主要記錄下三種重要的佇列,以及一種非常使用的雙端佇列

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。


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

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

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


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

 

相關文章