一:LinkedBlockingQueue介紹
1:LinkedBlockingQueue是一個基于鏈表實現的阻塞隊列,默認情況下,該阻塞隊列的大小為Integer.MAX_VALUE
,由于這個數值特別大,所以 LinkedBlockingQueue 也被稱作無界隊列,代表它幾乎沒有界限,隊列可以隨著元素的添加而動態增長,但是如果沒有剩余內存,則隊列將拋出OOM錯誤。所以為了避免隊列過大造成機器負載或者內存爆滿的情況出現,我們在使用的時候建議手動傳一個隊列的大小。
2:LinkedBlockingQueue內部由單鏈表實現,只能從head取元素,從tail添加元素。LinkedBlockingQueue采用兩把鎖的鎖分離技術實現入隊出隊互不阻塞,添加元素和獲取元素都有獨立的鎖,也就是說LinkedBlockingQueue是讀寫分離的,讀寫操作可以并行執行。
二:LinkedBlockingQueue使用
//指定隊列的大小創建有界隊列
LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>(100);
//無界隊列
LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>();//拿無界隊列舉例操作一些方法
LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>();//add() 里面本質也是用的offer()新增的元素linkedBlockingQueue.add(1);linkedBlockingQueue.offer(211);linkedBlockingQueue.add(5);Arrays.stream(linkedBlockingQueue.toArray()).forEach(a->{System.out.println("LinkedBlockingQueue toArray foreach:"+a);});/*** LinkedBlockingQueue toArray foreach:1* LinkedBlockingQueue toArray foreach:211* LinkedBlockingQueue toArray foreach:5*///從頭部獲得存放時間最長的元素Integer peek1 = linkedBlockingQueue.peek();System.out.println("LinkedBlockingQueue peek:"+peek1);//LinkedBlockingQueue peek:1//判斷元素是否存在boolean contains = linkedBlockingQueue.contains(211);System.out.println("LinkedBlockingQueue contains:"+contains);//LinkedBlockingQueue contains:true//從頭部取出存放時間最長的元素Integer poll1 = linkedBlockingQueue.poll();System.out.println("LinkedBlockingQueue poll:"+poll1);//LinkedBlockingQueue poll:1Arrays.stream(linkedBlockingQueue.toArray()).forEach(a->{System.out.println("LinkedBlockingQueue poll后 toArray foreach:"+a);});/*** LinkedBlockingQueue poll后 toArray foreach:211* LinkedBlockingQueue poll后 toArray foreach:5*///FIFO 刪除頭部最早進去的元素Integer remove = linkedBlockingQueue.remove();System.out.println("LinkedBlockingQueue remove:"+remove);//LinkedBlockingQueue remove:211//FIFO 添加元素頭部先增最新進入的元素,尾部最遲的元素try {