import java.util.concurrent.atomic.AtomicReference;
public class LockFreeQueue<T> {
private AtomicReference<Node> head;
private AtomicReference<Node> tail;
/**
* Create a new object of this class.
*/
public LockFreeQueue() {
Node sentinel = new Node(null);
head = new AtomicReference<Node>(sentinel);
tail = new AtomicReference<Node>(sentinel);
}
/**
* Enqueue an item.
* @param value Item to enqueue.
*/
public void enq(T value) {
// try to allocate new node from local pool
Node node = new Node(value);
while (true) { // keep trying
Node last = tail.get(); // read tail
Node next = last.next.get(); // read next
// are they consistent?
if (last == tail.get()) {
if (next == null) { // was tail the last node?
// try to link node to end of list
if (last.next.compareAndSet(next, node) {
// enq done, try to advance tail
tail.compareAndSet(last, node);
return;
}
} else { // tail was not the last node
// try to swing tail to next node
tail.compareAndSet(last, next);
}
}
}
}
/**
* Dequeue an item.
* @throws queue.EmptyException The queue is empty.
* @return Item at the head of the queue.
*/
public T deq() throws EmptyException {
while (true) {
Node first = head.get();
Node last = tail.get();
Node next = first.next.get();
// are they consistent?
if (first == head.get()) {
if (first == last) { // is queue empty or tail falling behind?
if (next == null) { // is queue empty?
throw new EmptyException();
}
// tail is behind, try to advance
tail.compareAndSet(last, next);
} else {
T value = next.value; // read value before dequeuing
if (head.compareAndSet(first, next)) {
return value;
}
}
}
}
}
/**
* Items are kept in a list of nodes.
*/
public class Node {
/**
* Item kept by this node.
*/
public T value;
/**
* Next node in the queue.
*/
public AtomicReference<Node> next;
/**
* Create a new node.
*/
public Node(T value) {
this.next = new AtomicReference<Node>(null);
this.value = value;
}
}
分享到:
相关推荐
本项目提供了一些推荐算法的Java实现,包括slopeone、SVD(奇异值分解)以及基于物品邻接的SVD(ItemNeighborSVD)。下面我们将详细探讨这些算法及其在Java中的实现。 1. **slopeone**: - Slope One是一种简单的...
java实现扫雷游戏java实现扫雷游戏java实现扫雷游戏 java实现扫雷游戏java实现扫雷游戏java实现扫雷游戏 java实现扫雷游戏java实现扫雷游戏java实现扫雷游戏 java实现扫雷游戏java实现扫雷游戏java实现扫雷游戏 java...
JAVA实现EXCEL XIRR函数
Java实现大富翁游戏Java实现大富翁游戏Java实现大富翁游戏 Java实现大富翁游戏Java实现大富翁游戏Java实现大富翁游戏 Java实现大富翁游戏Java实现大富翁游戏Java实现大富翁游戏 Java实现大富翁游戏Java实现大富翁...
java 实现 icmp协议测试 需要在java lib目录下添加libjpcap.so文件
Java 实现流媒体播放是一个涉及网络传输、多媒体处理和实时数据传输的重要技术。在这个大作业中,我们将探讨如何使用Java来构建一个能够接收并播放流媒体的系统。流媒体技术的核心在于将连续的音频或视频数据分割成...
AI五子棋游戏,Java实现.zipAI五子棋游戏,Java实现.zipAI五子棋游戏,Java实现.zip AI五子棋游戏,Java实现.zipAI五子棋游戏,Java实现.zipAI五子棋游戏,Java实现.zip AI五子棋游戏,Java实现.zipAI五子棋游戏,...
Java 实现电子签名是软件开发中的一个重要领域,特别是在法律文档、金融交易以及电子商务等场景中。电子签名可以确保数据的完整性和不可篡改性,从而增强了数字文件的安全性。在这个项目中,提供了三种不同的方法来...
java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码java实现小超市源码...
Java实现的中文分词程序是一种基于Java编程语言的文本处理工具,主要应用于处理中文文本,将其拆分成有意义的词汇单元,这一过程被称为分词。在自然语言处理(NLP)领域,分词是预处理阶段的关键步骤,为后续的文本...
java实现supermarket源码java实现supermarket源码java实现supermarket源码java实现supermarket源码java实现supermarket源码java实现supermarket源码java实现supermarket源码java实现supermarket源码java实现super...
java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码...
抢票软件的12306java实现,抢票软件的12306java实现,抢票软件的12306java实现,抢票软件的12306java实现,抢票软件的12306java实现,抢票软件的12306java实现,
本文将深入探讨这两种协议的工作原理,并提供它们在Java环境中的实现。 **Xmodem协议** Xmodem是最简单的文件传输协议之一,每一步传输128字节的数据块。它通过校验和机制来检测数据传输中的错误。Xmodem协议分为两...
Java作为一种广泛使用的编程语言,同样提供了多种方法来实现流量控制。本篇文章将深入探讨Java如何实现流量控制,并结合具体实例来阐述相关知识点。 首先,我们要理解流量控制的基本原理。在TCP(传输控制协议)中...
【Java实现课程表】是一个基于Java编程语言设计的特定于某个学校的教务系统课程表程序。这个程序的主要目的是为了展示如何使用Java技术来构建一个能够显示、管理个人课程的工具。由于不同学校的教务系统差异,这个...
Java实现扫雷游戏.zipJava实现扫雷游戏.zipJava实现扫雷游戏.zipJava实现扫雷游戏.zip Java实现扫雷游戏.zipJava实现扫雷游戏.zipJava实现扫雷游戏.zipJava实现扫雷游戏.zip Java实现扫雷游戏.zipJava实现扫雷游戏....
在Java开发Web办公系统时,实现Word在线编辑和流转是一项重要的功能需求。这通常涉及到用户无需下载文件到本地,即可在浏览器中直接编辑Word文档,并能进行版本控制和协同工作。PageOffice组件是一个强大的工具,它...
java实现的五子棋人机对战游戏.zipjava实现的五子棋人机对战游戏.zip java实现的五子棋人机对战游戏.zipjava实现的五子棋人机对战游戏.zip java实现的五子棋人机对战游戏.zipjava实现的五子棋人机对战游戏.zip java...
在Java实现中,`SipApplicationDispatcher`类通常用于处理SIP事件,如请求发送、接收响应等。开发者需要实现相应的监听器接口(如`javax.sip.EventListener`)以处理这些事件。 在提供的压缩包文件`Sip_Java`中,...