LinkedBlockingQueue节点的下一个不是volatile

yuc*_*hao 6 java volatile

我现在正在阅读LinkedBlockingQueue代码,但我有一个问题,也许这很简单,但我找不到答案,真的需要帮助.

我注意到Node.next不是volatile,如下所示:

static class Node<E> {
    E item;
    LinkedBlockingQueue.Node<E> next;

    Node(E var1) {
        this.item = var1;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,新节点(Node.next)的入队如何通过另一个线程对出列可见?

private void enqueue(Node<E> node) {
    // assert putLock.isHeldByCurrentThread();
    // assert last.next == null;
    last = last.next = node;
}

 private E dequeue() {
    // assert takeLock.isHeldByCurrentThread();
    // assert head.item == null;
    Node<E> h = head;
    Node<E> first = h.next;
    h.next = h; // help GC
    head = first;
    E x = first.item;
    first.item = null;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*son 2

方法enqueue()dequeue()是私有的,因此只能从同一类中的其他方法调用,例如peek()poll()put()offer()等。

锁定是在更高级别强制执行的,并且两个线程永远不可能在竞争条件下同时访问节点的实例变量。