现在的位置: 首页 > 综合 > 正文

无锁队列的实现 小结

2013年08月21日 ⁄ 综合 ⁄ 共 579字 ⁄ 字号 评论关闭

原文见 cool shell http://coolshell.cn/articles/8239.html

CAS,即lock-free的一种实现,是构成jdk concurrent包高效并发容器的重要基础,因此认真阅读了一下。

读后附注

对ABA问题的理解:

在DB里,根据一行记录中“最后修改时间”字段的值是否变更,作为更新该行记录时的参照物,是平时常见的一种做法,类似乐观锁。之所以这样做有效,是因为时间不会被任意改写,其始终线性递增,否则就有可能发生ABA问题。

而原文是想表达,本来指针指向的对象被回收并重新new出来会导致指针的值变更,但由于某些运行时优化,可能会出现不同实例间直接复用堆内存的情况,即指针指向的地址没变,但其指向的对象(的内容)已经变了。由于CAS只是单纯地比较指针,因此可能“看起来没变,其实已经变了。”

所以,那个“活生生的例子”欠妥,应该是辣妹本来准备了多个跟你同一款的皮箱准备调包,她得手后,会把装钱的皮箱掏空,然后从手头的所有皮箱里(包括那个刚被掏空的)任选一个,调包给你。如果你在皮箱上留了记号,大部分情况下,还是能觉察到被调包了;然而如果她选择“物归原主”,光看皮箱你是无法作出判断的。

对引用计数的理解:

 Fetch&Add(p->refcnt,
1);

这一句是人为给引用计数加了1,从而避免p被回收。只要不被回收,就不会导致ABA。

抱歉!评论已关闭.