AQS是java并发包中reenterlock,reenterreadwritelock,countDownLatch等并发工具类的底层实现,全称abstractQueueSynchronizer,他和synchronize的不同有:
    1.他支持中断,支持公平锁非公平锁,
    他的底层维护了一个volatile的state字段,还有持有该把锁的线程,以及一个chl的fifo的双向链表的等待队列。
    如果获取锁的时候获取成功,则将state++,将该线程设为持有锁的线程。否则会判断当前持有锁的线程是否是当前获取锁的线程,如果是,则可以获取锁成功。对于非公平可重入锁而言,此时其他线程再去获取这把锁的时候,会首先判断之前的线程是否释放了锁,如果释放了锁,state会减到0,并且持有该把锁的线程为null,此时就可以直接获取锁,将state++,持有锁的线程设为当前线程,否则会进行一个自旋操作,直到获取锁或者收到中断或者需要被阻塞。被阻塞后会加入fifo的等待队列。

    https://tech.meituan.com/2019/12/05/aqs-theory-and-apply.html

    LockSupport.park();
    LockSupport.unpark();
    使用发放许可证的方式阻塞当前线程;
    https://xie.infoq.cn/article/f17dad05cc323cedf7350ca23