24、并发队列与ABA问题解析

并发队列与ABA问题解析

1. 锁自由队列的内存回收与ABA问题

在并发队列的实现中,之前的队列实现依赖Java垃圾回收器来回收出队后的节点。但在某些情况下,我们可能希望自己进行内存管理,原因如下:
- 像C或C++这类语言不提供垃圾回收机制。
- 即使有垃圾回收,对于频繁创建和释放大量小对象的类,自行管理内存往往更高效。
- 若垃圾回收过程不是锁自由的,我们可能需要提供自己的锁自由内存回收机制。

一种自然的锁自由节点回收方式是让每个线程维护自己的私有空闲队列条目列表,代码如下:

ThreadLocal<Node> freeList = new ThreadLocal<Node>() {
    protected Node initialValue() { return null; };
};

当入队线程需要新节点时,它会尝试从线程本地空闲列表中移除一个节点。若列表为空,则使用 new 操作符分配一个节点。当出队线程准备回收一个节点时,它将该节点链接回线程本地列表。由于列表是线程本地的,无需昂贵的同步操作。不过,这种设计要求每个线程的入队和出队操作数量大致相同。若存在不平衡,可能需要更复杂的技术,如定期从其他线程“窃取”节点。

然而,若以最直接的方式回收节点,锁自由队列可能无法正常工作,这就引出了ABA问题。以下是一个ABA场景示例:
ABA场景
在图10.14的(a)部分,出队线程A观察到哨兵节点是a

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值