Queue 非阻塞队列
非阻塞队列
1 package com.test; 2 3 import java.util.LinkedList; 4 import java.util.PriorityQueue; 5 import java.util.Queue; 6 import java.util.concurrent.ConcurrentLinkedQueue; 7 8 public class LearnQueue { 9 public static void main(String[] args) { 10 //LinkedList 实现了双向队列 Deque,LinkedList允许添加null元素 11 Queue<String> queue = new LinkedList<>(); 12 queue.add("x"); 13 queue.add(null); 14 queue.offer(null); 15 for (String s : queue) { 16 System.out.println(s); 17 } 18 19 //Priority 可以指定初始容量,扩容方式是size<64的话,双倍扩容,>64的话1.5倍扩容 20 //Priority 构造方法可以指定自定义的比较器Comparator,不指定使用元素自己的排序。 21 //队列中的元素并不一定是有序的,但是队列的第一个元素肯定是优先级最高的。 22 // 造成这种情况的原因是:PriorityQueue是使用最小堆实现的优先队列的存储。参考:https://blog.csdn.net/u010853261/article/details/78520960 23 // 插入元素时,新增元素会与他的父节点比较,如果小于父节点则与父节点交换值,直到找到最适合他的位置。 24 // 删除元素时,从0节点开始找左右最小的子节点来替换父节点,直到当前节点大于size/2 25 Queue<String> priorityQueue = new PriorityQueue<>(2); 26 priorityQueue.add("yello"); 27 priorityQueue.add("zoo"); 28 priorityQueue.offer("aaaa"); 29 //此时队列中的值为 aaaa zoo yello (zoo 与 yello 顺序错误) 30 priorityQueue.poll(); 31 //此时队列中的值为 yello zoo 32 for (String s : priorityQueue) { 33 //结果为 axzzy 34 System.out.println(s); 35 } 36 37 // ConcurrentLinkedQueue 实现线程安全的方式是, 38 // tail 跟head 节点是volatile修饰的,保证了可见性 39 // 在修改队列时,调用了 UNSAFE.compareAndSwapObject() 保证了该操作的原子性 40 // 关于CAS的解释:https://juejin.im/post/5a73cbbff265da4e807783f5 41 Queue<String> concurrentLinkedQueue = new ConcurrentLinkedQueue<>(); 42 concurrentLinkedQueue.add("xxx"); 43 } 44 }