Concurrent Synchronizer Framework(3)
?
if (!tryAcquire(arg)) {node = create and enqueue new node;pred = node's effective predecessor;while (pred is not head node || !tryAcquire(arg)) {if (pred's signal bit is set)park();elsecompareAndSet pred's signal bit to true;pred = node's effective predecessor;}head = node;}?
if (tryRelease(arg) && head node's signal bit is set) {compareAndSet head's signal bit to false;unpark head's successor, if one exists}?
为了支持cancel,在acquire循环中,需要检查超时和中断。一个由超时或中断引起的被取消的线程需要设置它的状态和unpark它的后继,所以它可能重置指针。随着cancel,决定前驱后继和重置状态,可能会包含O(n)的遍历(n是Queue的长度)。因为一个已经被cancle的线程永远不可能再次阻塞,链接和状态需要被迅速的重建。