AQS的SIGNAL位如何理解,后继线程为何需前驱线程显式标记改写为CAS,入队前长尾词疑问?
- 内容介绍
- 相关推荐
本文共计1063个文字,预计阅读时间需要5分钟。
由于 `SIGNAL` 的语义是当我释放锁时,必须 unpark 我的后继,这个责任只能由前驱节点承担——即后继线程还未完成、甚至还未开始构造 `Node` 时。基本无法安全地给自己或他人设置状态。
常见错误现象:有人试图在 enq() 中让新节点一入队就 compareAndSetWaitStatus(this, 0, SIGNAL),结果要么 CAS 失败(前驱还没来得及更新),要么逻辑错乱(此时前驱可能还是 head,而 head 的 waitStatus 本不该是 SIGNAL)。
本文共计1063个文字,预计阅读时间需要5分钟。
由于 `SIGNAL` 的语义是当我释放锁时,必须 unpark 我的后继,这个责任只能由前驱节点承担——即后继线程还未完成、甚至还未开始构造 `Node` 时。基本无法安全地给自己或他人设置状态。
常见错误现象:有人试图在 enq() 中让新节点一入队就 compareAndSetWaitStatus(this, 0, SIGNAL),结果要么 CAS 失败(前驱还没来得及更新),要么逻辑错乱(此时前驱可能还是 head,而 head 的 waitStatus 本不该是 SIGNAL)。

