V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lux182
V2EX  ›  程序员

AQS 的 enq 方法真难懂啊

  •  
  •   lux182 · 161 天前 · 1006 次点击
    这是一个创建于 161 天前的主题,其中的信息可能已经有所发展或是发生改变。
    private Node enq(final Node node) {
            for (;;) {
                Node t = tail;
                if (t == null) { // Must initialize
                    if (compareAndSetHead(new Node()))
                        tail = head;
                } else {
                    node.prev = t;
                    if (compareAndSetTail(t, node)) {
                        t.next = node;
                        return t;
                    }
                }
            }
        }
    
    只是简单的生成一个 node 作为 head ,将参数 node 变为 tail , 最后将 tail 的 prev 指向 head ,head 的 next 指向 tail 。
    大牛炫技
    
    7 条回复    2021-12-14 09:08:26 +08:00
    lux182
        1
    lux182  
    OP
       161 天前
    后续时候,把参数 node 作为 tail 。tail 的 prev 指向前 tail 。前 tail 的 next 指向参数 node 。
    以此形成 node 链表。 简单的几行代码就实现了,真是鬼斧神工
    Canon1014
        2
    Canon1014  
       161 天前
    好像是为了解决并发性能初始化的时候首节点做了个空的虚节点,第二轮才真正的设置尾结点
    说错了楼下请打醒我,面试说错就社死了
    Canon1014
        3
    Canon1014  
       161 天前
    好像是为了解决并发问题,初始化的时候首节点做了个空的虚节点,第二轮才真正的设置尾结点
    说错了楼下请打醒我,面试说错就社死了

    性能->问题
    liian2019
        4
    liian2019  
       161 天前
    看一次忘一次
    fkdog
        5
    fkdog  
       161 天前   ❤️ 1
    其实 AQS 的本质其实就是双向链表+LockSupport.park()和 LockSupport.unpark()实现的同步器。单看 enq 并没有什么卵用,你还得结合 shouldParkAfterFailedAcquire 、unparkSuccessor 、setHeadAndPropagate 、cancelAcquire 几个方法一起看。

    任意时候 node 状态都会发生变化,所以针对链表的操作用了大量的 forloop+cas 操作来保证并发安全。jdk8 版本的这个 AQS 应该是经过了 N 个版本的修订才会搞得这么零零散散一堆方法。。

    我记得 8 版本以后的某个版本好像 aqs 有大篇幅的重写。。
    lux182
        6
    lux182  
    OP
       160 天前
    @fkdog 是的 最近在看
    lux182
        7
    lux182  
    OP
       160 天前
    @Canon1014 差不多意思
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1070 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:53 · PVG 04:53 · LAX 13:53 · JFK 16:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.