改进:原是每个非头结点tryAcquire的时候不断cas设置状态抢占锁,改进后为,头结点释放锁后,唤醒后续的节点
为何使用双向链表
首先头结点释放锁后需要向后唤醒后续节点
公平锁时,非头结点需要向前判断前一个是不是头结点
进链表需要CAS,防止多线程环境插入时乱序或缺失
独占锁,唤醒的线程获取锁后,不向后继续唤醒
共享锁,唤醒的线程获取锁后,向后继续唤醒
park()和unpark()作用分别是阻塞线程和解除阻塞线程,且park和unpark不会遇到suspend和resume可能引发的死锁问题。
在互斥锁中,state表示线程是否已经获取了锁,0未获取,1已经获取,大于1表示重入数。
AQS提供了getState(),setState(),compareAndSetState()来获取和修改state的值,这些操作需要atomic包的支持,采用CAS操作。