⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linkedqueue.java

📁 java concurrency in practice 源码. JAVA并发设计
💻 JAVA
字号:
package net.jcip.examples;import java.util.concurrent.atomic.*;import net.jcip.annotations.*;/** * LinkedQueue * <p/> * Insertion in the Michael-Scott nonblocking queue algorithm * * @author Brian Goetz and Tim Peierls */@ThreadSafepublic class LinkedQueue <E> {    private static class Node <E> {        final E item;        final AtomicReference<LinkedQueue.Node<E>> next;        public Node(E item, LinkedQueue.Node<E> next) {            this.item = item;            this.next = new AtomicReference<LinkedQueue.Node<E>>(next);        }    }    private final LinkedQueue.Node<E> dummy = new LinkedQueue.Node<E>(null, null);    private final AtomicReference<LinkedQueue.Node<E>> head            = new AtomicReference<LinkedQueue.Node<E>>(dummy);    private final AtomicReference<LinkedQueue.Node<E>> tail            = new AtomicReference<LinkedQueue.Node<E>>(dummy);    public boolean put(E item) {        LinkedQueue.Node<E> newNode = new LinkedQueue.Node<E>(item, null);        while (true) {            LinkedQueue.Node<E> curTail = tail.get();            LinkedQueue.Node<E> tailNext = curTail.next.get();            if (curTail == tail.get()) {                if (tailNext != null) {                    // Queue in intermediate state, advance tail                    tail.compareAndSet(curTail, tailNext);                } else {                    // In quiescent state, try inserting new node                    if (curTail.next.compareAndSet(null, newNode)) {                        // Insertion succeeded, try advancing tail                        tail.compareAndSet(curTail, newNode);                        return true;                    }                }            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -