Semaphore、CLH疑惑

来源:4-12 AQS之面试官:讲讲CLH队列的原理

Panda_io

2021-06-21

问题一:自定义Semaphore释放锁的时候没有自旋疑惑

  protected boolean tryReleaseShared(int arg) {
            // 老师我个人觉得下面两行代码如果不加while形成自旋,一旦有其他线程在当前线程第一行代码执行完执行了将state更新成state - 1, 或者 state + 1,这时候这段逻辑就会返回false,也就是state会丢失1
			int available = getState();
			return compareAndSetState(available, available + 1);
		}

问题二:老师说CHL是单向链表,查看源码,CHLNode有双向的指针

AbstractQueuedSynchronizer里面Node定义如下

static final class Node {
// 截取的部分属性
volatile Node prev;
volatile Node next;
...
}
写回答

2回答

求老仙

2021-06-24

如果是多个线程可能会同时释放,那么释放也是需要竞争的。

0
1
Panda_io
明白了,谢谢老师,感谢感谢
2021-06-24
共1条回复

求老仙

2021-06-24

是的,我讲的是提出paper的人用的chl。实际实现的时候为了方便java增加了双向指针。不过在cas进行无所操作的时候其实只围绕单向的一致性。

0
1
Panda_io
老师第一个问题您还没回答,恳请老师指点一下
2021-06-24
共1条回复

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程

相似问题

CLH链表

回答 1

哑巴节点

回答 1

后续疑惑

回答 1

b+树疑惑

回答 1