AQS是一个用来构建锁和同步器的框架,Lock包里面的锁比如(Reetrantlock,读写锁),concurrent包里面的(CountDwonLatch,Semaphore, CyclicBarrier)都是基于AQS来实现的
他里面主要包括两个元素,一个是由volatile修饰的int类型的state变量用来表示资源,一个CHL同步队列,他就是一个双向链表的形式,包括两个指针head和tail指针,然后使用cas来保证操作的原子性
lock会先调用aquire方法,然后aquire方法会调用tryaquire对state进行一个cas操作,如果state为0的话就说明当前锁没有被占有,那么就加锁成功并且把当前运行的线程设为自己(exclusiveownerthread),如果state为1的话那么就会判断占用的线程是不是自己,如果是的话就会把state加一来实现一个重入的效果,如果不是那么就会返回false,然后就会调用一个addwaiter函数把当前线程封装成一个Node加入等待队列里面,acquireQueued()判断返回的Node的前置节点是不是head,如果是的话就调用tryaquire抢占,如果抢占成功就把之前head释放掉然后变成自己,如果不是的话就会将head的waitstatus = waitsignal=-1,并调用locksupport.park()挂起自己,等待其他线程释放锁唤醒他
release方法释放锁将state变为0,然后查看自己的status是否为waitsignal,然后LockSupport.unpark(node.next.thread)唤醒下一个线程
公平锁不允许插队,只有前驱节点为head的线程才能获取锁,fairSync的tryaquire方法会判断当前的等待队列中没有节点或者说只有一个节点是当前线程,只有这样的情况才允许抢占锁,否则tryaquire就返回false入队等待
非公平锁性能更高可以减少唤醒线程的开销,但是容易造成饥饿
