老师stampedLock的获取锁源码,老师能帮忙解惑下么?阻塞的读线程cowait是挂在写节点的下方么?老师能解惑下基于的理论模型
private long acquireWrite(boolean interruptible, long deadline) {
WNode node = null, p;
for (int spins = -1;;) { // spin while enqueuing
long m, s, ns;
//如果当前的state是无锁状态即100000000
if ((m = (s = state) & ABITS) == 0L) {
//设置成写锁
if (U.compareAndSwapLong(this, STATE, s, ns = s + WBIT))
return ns;
}
else if (spins < 0)
//当前锁状态为写锁状态,并且队列为空,设置自旋值
spins = (m == WBIT && wtail == whead) ? SPINS : 0;
else if (spins > 0) {
//自旋操作,就是让线程在此自旋
if (LockSupport.nextSecondarySeed() >= 0)
--spins;
}
//如果队列尾元素为空,初始化队列
else if ((p = wtail) == null) { // initialize queue
WNode hd = new WNode(WMODE, null);
if (U.compareAndSwapObject(this, WHEAD, null, hd))
wtail = hd;
}
//当前要加入的元素为空,初始化当前元素,前置节点为尾节点
else if (node == null)
node = new WNode(WMODE, p);
//队列的稳定性判断,当前的前置节点是否改变,重新设置
else if (node.prev != p)
node.prev = p;
//将当前节点加入尾节点中
else if (U.compareAndSwapObject(this, WTAIL, p, node)) {
p.next = node;
break;
}
}
展开
作者回复: 这可难倒我了,并发库的源码我只是零散得看的,看完基本也忘得差不多了,感觉自己也不是搞算法的料,放弃了😂