6、同步隊列SynchronousQueue
? ? 同步隊列是一個不存儲元素的阻塞隊列,每一個put操作必須等待一個take操作,否則就不能繼續添加元素。這種場景下可用于多個線程之間的通訊,a線程可以把需要傳遞的數據放到同步隊列中,b線程消費隊列中的數據,因為本身不存儲元素,所以SynchronousQueue的吞吐量高于ArrayBlockingQueue和LinkedBlockingQueue
? ? 首先看一下結構,從結構上跟別的隊列并沒有什么太大的區別,所以區別就要看里面的源碼了
? ??SynchronousQueue隊列分為兩種模式默認采取的非公平鎖,SynchronousQueue不存儲元素,所以會有很多的生產者和消費者阻塞,對于這些阻塞的線程,非公平鎖中存入了一個LIFO隊列中,其實就是把線程放入隊列,而不是數據
? ? 當SynchronousQueue構造函數中入口參數改為true,此時隊列采取公平鎖,阻塞的線程存入一個FIFO隊列中
? ? 此處具一個例子
7、LinkedBlockingDeque鏈表雙向阻塞隊列
? ? 由鏈表結構組成的雙向阻塞隊列,雙向隊列指的是可以從隊列的兩端插入和移出元素
8、鏈表傳輸隊列LinkedTransferQueue
? ? 這個需要重點說一下,首先看一下類組成結構如圖8-1
? ? 此處我們單獨拿出TransferQueue接口所擴展的方法來看這個傳輸隊列的作用,如圖8-2
? ? ? ? 我們可以看到TransferQueue接口擴展的幾個方法:
? ? ? ? ? ? 1、transfer(E e) :如果目前有消費者阻塞,則直接移交消費者,如果沒有,放到隊列尾部且生產者進入阻塞,直到數據被消費
? ? ? ? ? ? 2、tryTransfer(E e):如果目前有消費者阻塞,則直接移交消費者,如果沒有,直接返回false,而且數據不進入隊列,這個操作不會阻塞線程
? ? ? ? ? ? 3、tryTransfer(E e,long timeOut,TimeUnit unit):如果目前有消費者阻塞,則直接移交消費者,如果沒有,放到隊列尾部且生產者進入阻塞,等到消費者來消費,如果指定時間中無法被消費者獲取,則直接返回false,同時元素被移除
? ? ? ? ? ? 4、hasWaitingConsumer():判斷有沒有等待的消費者
? ? ? ? ? ? 5、getWaitingConsumerCount():獲取目前存在的消費者的數量
? ? 知道了這些,基本就能大概了解到這個實現TransferQueue接口的類大多能做什么了,接下來直接上一個簡單的應用
? ? 如圖8-3