AQS的理解

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时,主线程才继续执行

你可能感兴趣的:(java,jvm,开发语言)