1.AQS维护1+N个队列
1代表同步队列,是双向的,有表头,表尾;head指向的节点中没有线程,tail指向的节点中有线程
N代表condition队列,是单向的,也有表头,表尾,节点类型与同步队列中的一致,new几个conditionObject就代表有几个condition队列
2.节点各状态
cancelled =1 表明线程取消了
normal=0 初始值
signal=-1 等待通知
condition=-2 在condition队列中等待
propagate=-3 表明可以无条件的传播下去
3.Condition
执行await()方法时,当前线程添加到condition队列中,同时唤醒同步队列中一个线程,自身也进行park(当在同步队列中且unpark后会尝试获取锁)
执行signal()方法时,会删除condition队列中队首的节点,并将其添加到同步队列的队尾并unpark
注:如果同步队列中还有其它线程节点排列在前面,则await会等前面的节点释放锁之后再执行
执行awaitNanos(long nanosTimeout)时,当前线程添加到condition队列中,同时唤醒同步队列中一个线程,自身也进行parkNanos;当parkNanos结束后,将自己添加到同步队列中,然后尝试从同步队列中获取锁,所以awaitNanos(long nanosTimeout)执行完后也不是马上执行后面的逻辑,可能同步队列中还有排在前面的thread节点
4.FairSync与NonFairSync
FairSync 从同步队列中,从头到尾一个个的取线程节点,新加的线程正常进入队尾。
NonFairSync 正常也是从同步队列中,从头到尾一个个的取线程节点,但新加的线程允许抢占式的获取,不排队。
5.常用的AQS的几种工具类
(1)CyclicBarrier
到达最大parities时才执行action,再重置barrier
(2)Semaphore
不能超过最大permit
(3)CountDownLatch
等到countDown到0时,主线程才继续执行