AQS 源码里,为什么 head 和 tail 是个成员变量而不是静态变量啊

2020-05-16 12:01:38 +08:00
 amiwrong123

现在源码也没看完,但这点感觉好难理解啊。

    /**
     * Head of the wait queue, lazily initialized.  Except for
     * initialization, it is modified only via method setHead.  Note:
     * If head exists, its waitStatus is guaranteed not to be
     * CANCELLED.
     */
    private transient volatile Node head;

    /**
     * Tail of the wait queue, lazily initialized.  Modified only via
     * method enq to add new wait node.
     */
    private transient volatile Node tail;

现在知道 CHL 队列 是一个 Node 的双向链表,而好多操作里面都需要获得 head/tail 成员(即每个 Node 都是知道,队列的 head 和 tail 是哪个 Node ),那这岂不是要时刻保持 双向链表里每个 Node 的 head 和 tail 都是正确的。

那把 head 和 tail 设置为静态变量,岂不是方便了很多。反正同时只有一个 Node 是 head 嘛

1761 次点击
所在节点    Java
4 条回复
adguy
2020-05-16 13:45:59 +08:00
现在知道 CHL 队列 是一个 Node 的双向链表,而好多操作里面都需要获得 head/tail 成员(即每个 Node 都是知道,队列的 head 和 tail 是哪个 Node )
你的话到这里 都没毛病,

那这岂不是要时刻保持 双向链表里每个 Node 的 head 和 tail 都是正确的。

这一句也没毛病,但是 volatile 已经保证了每次获取到的都是最新的。


那把 head 和 tail 设置为静态变量,岂不是方便了很多。反正同时只有一个 Node 是 head 嘛

这有啥方不方便的呢?静态变量是为了不初始化类就能获取到,但是对于锁来说没必要,肯定是初始化锁了才会在内部调用头结点和尾节点。

你这个问题挺无厘头的。。。。。。,乍一看有点蒙
gexyuzz
2020-05-16 14:08:46 +08:00
你是想实现全局锁吗
freebird1994
2020-05-16 14:16:18 +08:00
用面向对象的角度是不是好理解些,每个锁持有一个队列,队列有头尾,与锁对象关联。而不是与这个类关联
amiwrong123
2020-05-16 21:30:17 +08:00
@adguy
@freebird1994
@gexyuzz
好吧,我发现我看错源码了,问了个 sb 的问题。此帖沉了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/672309

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX