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 }
原文地址:https://www.cnblogs.com/han6/p/11243500.html