线程安全:
syn。。。
volatile
cas
-------------------------------
实例化会创建一个头节点。
添加节点是判断tail的下一个节点的指向是不是空,是空则tail就指向下一个节点。
再次来一个:tail的下一个节点不是空的,则p指向tail下一个节点。q指向tail,q指向p。
p指向q下一个节点。。。。。。很乱07:12
tail不一定指向最后一个节点。
-----------------
移除:head不一定一直指向头节点
-----------------
总结:cas增加节点,q指向下一个节点是cas操作的。设置头尾节点。
首先初始化创建了一个节点
public ConcurrentLinkedDeque() {
head = tail = new Node<E>(null);
}
入队
private void linkLast(E e) {
checkNotNull(e);//为空 创建一个空指针异常即可
final Node<E> newNode = new Node<E>(e);
restartFromTail:
for (;;)
for (Node<E> t = tail, p = t, q;;) {
if ((q = p.next) != null &&
(q = (p = q).next) != null)
p = (t != (t = tail)) ? t : q;
else if (p.prev == p)
continue restartFromTail;
else {
//p是组后一个节点
newNode.lazySetPrev(p);
if (p.casNext(null, newNode)) {
if (p != t) // hop two nodes at a time
casTail(t, newNode);
return;
}
}
}
}
入队,又来了一个节点,这个是链表记住了。
出队:
private void linkFirst(E e) {
checkNotNull(e);
final Node<E> newNode = new Node<E>(e);
restartFromHead:
for (;;)
for (Node<E> h = head, p = h, q;;) {
if ((q = p.prev) != null &&
(q = (p = q).prev) != null)
// Check for head updates every other hop.
// If p == q, we are sure to follow head instead.
p = (h != (h = head)) ? h : q;
else if (p.next == p) // PREV_TERMINATOR
continue restartFromHead;
else {
// p is first node
newNode.lazySetNext(p); // CAS piggyback
if (p.casPrev(null, newNode)) {
// Successful CAS is the linearization point
// for e to become an element of this deque,
// and for newNode to become "live".
if (p != h) // hop two nodes at a time
casHead(h, newNode); // Failure is OK.
return;
}
// Lost CAS race to another thread; re-read prev
}
}
}
-----------------
这个博客没看懂啊。
-------------------------------------------------------------------------------------------------------------------------