并发队列与ABA问题解析
1. 锁自由队列的内存回收与ABA问题
在并发队列的实现中,之前的队列实现依赖Java垃圾回收器来回收出队后的节点。但在某些情况下,我们可能希望自己进行内存管理,原因如下:
- 像C或C++这类语言不提供垃圾回收机制。
- 即使有垃圾回收,对于频繁创建和释放大量小对象的类,自行管理内存往往更高效。
- 若垃圾回收过程不是锁自由的,我们可能需要提供自己的锁自由内存回收机制。
一种自然的锁自由节点回收方式是让每个线程维护自己的私有空闲队列条目列表,代码如下:
ThreadLocal<Node> freeList = new ThreadLocal<Node>() {
protected Node initialValue() { return null; };
};
当入队线程需要新节点时,它会尝试从线程本地空闲列表中移除一个节点。若列表为空,则使用 new 操作符分配一个节点。当出队线程准备回收一个节点时,它将该节点链接回线程本地列表。由于列表是线程本地的,无需昂贵的同步操作。不过,这种设计要求每个线程的入队和出队操作数量大致相同。若存在不平衡,可能需要更复杂的技术,如定期从其他线程“窃取”节点。
然而,若以最直接的方式回收节点,锁自由队列可能无法正常工作,这就引出了ABA问题。以下是一个ABA场景示例:
在图10.14的(a)部分,出队线程A观察到哨兵节点是a
超级会员免费看
订阅专栏 解锁全文
45

被折叠的 条评论
为什么被折叠?



