• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lux182
V2EX  ›  程序员

AQS 的 enq 方法真难懂啊

  •  
  •   lux182 · Dec 13, 2021 · 2307 views
    This topic created in 1634 days ago, the information mentioned may be changed or developed.
    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 replies    2021-12-14 09:08:26 +08:00
    lux182
        1
    lux182  
    OP
       Dec 13, 2021
    后续时候,把参数 node 作为 tail 。tail 的 prev 指向前 tail 。前 tail 的 next 指向参数 node 。
    以此形成 node 链表。 简单的几行代码就实现了,真是鬼斧神工
    Canon1014
        2
    Canon1014  
       Dec 13, 2021
    好像是为了解决并发性能初始化的时候首节点做了个空的虚节点,第二轮才真正的设置尾结点
    说错了楼下请打醒我,面试说错就社死了
    Canon1014
        3
    Canon1014  
       Dec 13, 2021
    好像是为了解决并发问题,初始化的时候首节点做了个空的虚节点,第二轮才真正的设置尾结点
    说错了楼下请打醒我,面试说错就社死了

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

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

    我记得 8 版本以后的某个版本好像 aqs 有大篇幅的重写。。
    lux182
        6
    lux182  
    OP
       Dec 14, 2021
    @fkdog 是的 最近在看
    lux182
        7
    lux182  
    OP
       Dec 14, 2021
    @Canon1014 差不多意思
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5797 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 03:00 · PVG 11:00 · LAX 20:00 · JFK 23:00
    ♥ Do have faith in what you're doing.