1. 程式人生 > >ArrayBlockingQueue和LinkedBlockingQueue

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