Java 非阻塞队列 ConcurrentLinkedQueue 真的是完全线程安全的吗?

为什么在 size 方法里面没有加锁,这样在统计的时候不会被其他线程干扰吗?

public int size() {
    int count = 0;
    // first()获取第一个具有非空元素的节点,若不存在,返回null
    // succ(p)方法获取p的后继节点,若p==p,next,则返回head,表示回到头部重新开始找
    for (Node<E> p = first(); p != null; p = succ(p))
    if (p.item != null)
    if (++count == Integer.MAX_VALUE)
        break;
    return count;
}

据JDK 介绍,这个类是无界线程安全的链表队列,这个 size 方法在并发应用中是不准确的:

/**
     * Returns the number of elements in this queue.  If this queue
     * contains more than {@code Integer.MAX_VALUE} elements, returns
     * {@code Integer.MAX_VALUE}.
     *
     * <p>Beware that, unlike in most collections, this method is
     * <em>NOT</em> a constant-time operation. Because of the
     * asynchronous nature of these queues, determining the current
     * number of elements requires an O(n) traversal.
     * Additionally, if elements are added or removed during execution
     * of this method, the returned result may be inaccurate.  Thus,
     * this method is typically not very useful in concurrent
     * applications.
     *
     * @return the number of elements in this queue
     */