上一篇 <<<線程池
下一篇 >>>Callable與Future模式
并發(fā)隊列類型
一個是以ConcurrentLinkedQueue為代表的高性能非阻塞隊列
一個是以BlockingQueue接口為代表的阻塞隊列
都繼承自Queue。
阻塞和非阻塞隊列的區(qū)別
都繼承自Queue外潜。
阻塞隊列:
a、隊列為空的時候裆蒸,獲取元素會阻塞---直到有新的元素加入
b祥得、隊列為滿的時候,添加元素會阻塞---直到有元素被獲取走或情況
非阻塞隊列:
a根灯、隊列為空的時候哭当,獲取元素會返回null
b低千、隊列是無界的【其實底層是有最大數(shù)的】配阵,所以不存在為滿的情況
常用隊列
1.ArrayDeque, (數(shù)組雙端隊列)
2.PriorityQueue, (優(yōu)先級隊列)
3.ConcurrentLinkedQueue, (基于鏈表的并發(fā)隊列)
4.DelayQueue, (延期阻塞隊列)(阻塞隊列實現(xiàn)了BlockingQueue接口)
5.ArrayBlockingQueue, (基于數(shù)組的并發(fā)阻塞隊列)
6.LinkedBlockingQueue, (基于鏈表的FIFO阻塞隊列)
7.LinkedBlockingDeque, (基于鏈表的FIFO雙端阻塞隊列)
8.PriorityBlockingQueue, (帶優(yōu)先級的無界阻塞隊列)
9.SynchronousQueue (并發(fā)同步阻塞隊列)
ConcurrentLinkedQueue介紹
a、性能好于BlockingQueue
b示血、基于鏈接節(jié)點的方式棋傍,是無界的
c、使用無鎖機制,一直添加尾結點难审,是線程安全的
d瘫拣、重要方法:
add 和offer() 都是加入元素的方法(在ConcurrentLinkedQueue中這倆個方法沒有任何區(qū)別)
poll() 和peek() 都是取頭元素節(jié)點,區(qū)別在于前者會刪除元素告喊,后者不會麸拄。
BlockingQueue介紹
a、位于并發(fā)包(java.util.concurrent)下的黔姜,是屬于線程安全的
b拢切、2種隊列方式:
先進先出(FIFO):先插入的隊列的元素也最先出隊列,類似于排隊的功能秆吵。從某種程度上來說這種隊列也體現(xiàn)了一種公平性淮椰。
后進先出(LIFO):后插入隊列的元素最先出隊列,這種隊列優(yōu)先處理最近發(fā)生的事件纳寂。
c主穗、常用子類
ArrayBlockingQueue 有界、先進先出FIFO毙芜、內部實現(xiàn)是數(shù)組有序
線程池中的隊列使用情況
newFixedThreadPool忽媒、newSingleThreadExecutor[LinkedBlockingQueue]有界無界是配置的、先進先出FIFO腋粥、內部實現(xiàn)是鏈表
PriorityBlockingQueue 具有優(yōu)先級的無界阻塞隊列 允許插入null對象(對象都要實現(xiàn)java.lang.Comparable排序接口)晦雨,可以使用迭代器Iterator(無法保證迭代順序)
newCachedThreadPool[SynchronousQueue]隊列內部僅允許容納一個元素。當一個線程插入一個元素后會被阻塞隘冲,除非這個元素被另一個線程消費金赦。
newScheduledThreadPool[DelayedWorkQueue]
相關文章鏈接:
<<<多線程基礎
<<<線程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Java內存模型(JMM)
<<<Volatile解決JMM的可見性問題
<<<Volatile的偽共享和重排序
<<<CAS無鎖模式及ABA問題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步計數(shù)器
<<<Semaphore信號量
<<<CyclicBarrier屏障
<<<線程池
<<<Callable與Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線程總結