ArrayBlockingQueue和LinkedBlockingQueue
1、BlockingQueue接口定義了一種阻塞的FIFO queue
ArrayBlockingQueue和LinkedBlockingQueue的區別:
1. 隊列中鎖的實現不同
ArrayBlockingQueue實現的隊列中的鎖是沒有分離的,即生產和消費用的是同一個鎖;
LinkedBlockingQueue實現的隊列中的鎖是分離的,即生產用的是putLock,消費是takeLock
2. 在生產或消費時操作不同
ArrayBlockingQueue實現的隊列中在生產和消費的時候,是直接將枚舉對象插入或移除的;
LinkedBlockingQueue實現的隊列中在生產和消費的時候,需要把枚舉對象轉換為Node<E>進行插入或移除,會影響性能
3. 隊列大小初始化方式不同
ArrayBlockingQueue實現的隊列中必須指定隊列的大小;
LinkedBlockingQueue實現的隊列中可以不指定隊列的大小,但是默認是Integer.MAX_VALUE
方法:
offer
將元素插入隊列,成功返回true,如果當前沒有可用的空間,則返回false
offer(E e, long timeout, TimeUnit unit)
將元素插入隊列,在到達指定的等待時間前等待可用的空間
E poll(long timeout, TimeUnit unit)
獲取並移除隊列的頭部,在指定的等待時間前等待可用的元素
void put(E e)
將元素插入隊列,將等待可用的空間(堵塞)
take()
獲取並移除隊列的頭部,在元素變得可用之前一直等待(堵塞)
在Java多線程應用中,隊列的使用率很高,多數生產消費模型的首選數據結構就是隊列(先進先出)。Java提供的線程安全的Queue可以分為阻塞隊列和非阻塞隊列,其中阻塞隊列的典型例子是BlockingQueue,非阻塞隊列的典型例子是ConcurrentLinkedQueue,在實際應用中要根據實際需要選用阻塞隊列或者非阻塞隊列。
註:什麽叫線程安全?這個首先要明確。線程安全就是說多線程訪問同一代碼,不會產生不確定的結果。
並行和並發區別
1、並行是指兩者同時執行一件事,比如賽跑,兩個人都在不停的往前跑;
2、並發是指資源有限的情況下,兩者交替輪流使用資源,比如一段路(單核CPU資源)同時只能過一個人,A走一段後,讓給B,B用完繼續給A ,交替使用,目的是提高效率
LinkedBlockingQueue
由於LinkedBlockingQueue實現是線程安全的,實現了先進先出等特性,是作為生產者消費者的首選,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,默認最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。
LinkedBlockingQueue對象是 線程阻塞-安全的 ,不接受 null 元素
ArrayBlockingQueue和LinkedBlockingQueue