简介
ConcurrentLinkedQueue 是线程安全的非阻塞队列,内部是单向链表。ConcurrentLinkedQueue 使用CAS机制保证线程安全,而LinkedBlockingQueue使用两个lock保证线程安全,ConcurrentLinkedQueue 性能比LinkedBlockingQueue高很多。需要注意的是ConcurrentLinkedQueue 的头节点和尾节点都具有滞后性,直接读取不应当准确,不能直接使用,一般需要遍历。
ConcurrentLinkedQueue 类
public class ConcurrentLinkedQueue extends AbstractQueue
implements Queue, java.io.Serializable
继承AbstractQueue,并实现Queue接口
重要内部类 Node
private static class Node
Node 属性
// 元素
volatile E item;
// 下一个元素
volatile Node next;
// 内存操作,不安全类
private static final sun.misc.Unsafe UNSAFE;
// 内存操作当前元素偏移量
private static final long itemOffset;
// 内存操作下个元素偏移量
private static final long nextOffset;
Node 初始化UNSAFE
static {
try {
UNSAFE = sun.misc.Unsafe.getUnsafe();
Class> k = Node.class;
itemOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField("item"));
nextOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField("next"));
} catch (Exception e) {
throw new Error(e);
}
}
UNSAFE 只能通过反射进行初始化
Node