java线程安全的链表_数据结构 - ConcurrentLinkedQueue 线程安全链表队列

本文详细介绍了Java中的ConcurrentLinkedQueue,这是一个线程安全的非阻塞队列,基于单向链表实现。通过CAS机制保证线程安全,性能优于LinkedBlockingQueue。文章讨论了其内部Node类、内存操作以及关键方法如add、offer、poll和peek的实现细节。
摘要由CSDN通过智能技术生成

114ebed0fcb9175d4b342cb781681f6e.png

简介

ConcurrentLinkedQueue 是线程安全的非阻塞队列,内部是单向链表。ConcurrentLinkedQueue 使用CAS机制保证线程安全,而LinkedBlockingQueue使用两个lock保证线程安全,ConcurrentLinkedQueue 性能比LinkedBlockingQueue高很多。需要注意的是ConcurrentLinkedQueue 的头节点和尾节点都具有滞后性,直接读取不应当准确,不能直接使用,一般需要遍历。

ConcurrentLinkedQueue 类

public class ConcurrentLinkedQueue extends AbstractQueue

implements Queue, java.io.Serializable

继承AbstractQueue,并实现Queue接口

重要内部类 Node

private static class Node

Node 属性

// 元素

volatile E item;

// 下一个元素

volatile Node next;

// 内存操作,不安全类

private static final sun.misc.Unsafe UNSAFE;

// 内存操作当前元素偏移量

private static final long itemOffset;

// 内存操作下个元素偏移量

private static final long nextOffset;

Node 初始化UNSAFE

static {

try {

UNSAFE = sun.misc.Unsafe.getUnsafe();

Class> k = Node.class;

itemOffset = UNSAFE.objectFieldOffset

(k.getDeclaredField("item"));

nextOffset = UNSAFE.objectFieldOffset

(k.getDeclaredField("next"));

} catch (Exception e) {

throw new Error(e);

}

}

UNSAFE 只能通过反射进行初始化

Node

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值