读书人

jdk中cocurrent上的AbstractQueuedSyn

发布时间: 2012-12-23 11:28:15 作者: rapoo

jdk中cocurrent下的AbstractQueuedSynchronizer理解记录

?? 以前虽然看过一次AQS的源码实现,但在过一段时间后与同学交流时,发觉自己理解并不够深,印像太浅。需要做一个记录整理,帮助自己消化。

?

AQS中Node的设计:?

?

jdk中cocurrent上的AbstractQueuedSynchronizer理解记录

几个点:

1. Node实现作者:?"CLH" (Craig, Landin, and?* Hagersten) ,有名的CLH queue

2. 是一个FIFO的链表的实现,对于队列的控制经常要做double-check。

3. Node节点通过一个int waiteStatus代表一些不同意义的状态。

?

SIGNAL=-1,代表是需要当前Node节点需要唤起后一个Node节点。在Node节点enqueue时,会设置前一个节点的状态。这样链式的唤醒,完成这样的一个交接棒。CONDITION = -2 ,?4. nextWaiter一个标志位,就是用于表明是采用的共享锁还是排他锁。同时也是其对应condition队列的引用节点。
来看一下Node操作的一个double-check设计
node的equeue操作:?
   回去好好研读下 这里自己在理解上有不少问题   

1. 自旋锁的理解有偏差。 一般自旋锁是以cpu换效率。如果thread.wait阻塞100ns超时,线程切换(阻塞/唤醒)的代价比较高,肯能超过了100ns。这时就可以选择while(true){}的死循环来处理。
Exchanger类中有一个自旋锁的使用:
Node s = node.next;        if (s == null || s.waitStatus > 0) { //位置1            s = null;            for (Node t = tail; t != null && t != node; t = t.prev)                if (t.waitStatus <= 0)                    s = t;        }

注意下位置1,s.waitStatus代表的就是cancel的状态判断。
再看一下,cancelAcquire代码行:693行,node.next = node; // help GC
处理cancel节点时,会修改next节点,导致unparkSuccessor时next节点就不再是一个闭环。所以这时需要从tail一直往前查找。
6 楼 wuwenjie0506 2011-04-10 文中的SINGLE应为SIGNAL。 7 楼 rxin2009 2012-09-15 请教lz一个cas操作应用的问题:用cas操作处理并发的时候,如果失败,常用的补救措施(我就只知道这一种)如文中的发展锁机制实现,但是有点不明白的就是:在V的值改变使得不与expect值对应,这个时候如果他们始终不同,程序不是进了死循环了吗?

读书人网 >编程

热点推荐