AbstractQueueSynchronizer AQS
使用Node实现FIFO队列,Node中包含 前驱,后继,节点类型(nextWaiter),节点状态(waitStatus),所属线程
用state标示状态 0:还没有线程获取锁 1;有一个线程获取锁 >1:重入锁的数量
AQS入队 acquire
尝试获取锁资源(tryAcquire())->获取锁失败 ->构建Node节点(addWaiter) ->初始化AQS队列并入队 ->自旋 ->获取锁失败或前驱节点不为head节点 ->更改前驱节点状态为-1 ->挂起当前线程
AQS释放 release
尝试释放(tryRelease)-> 将head节点waiteStatus更改为0->唤醒head节点的子节点->继续自旋执行入队挂起线程-> 前驱节点为head节点获取资源成功->head指针后移(setHead())->推出自旋
共享锁 当 前驱节点为head节点获取资源成功->检查资源状态是否足够满足下一节点->满足则继续释放
tryAcquire
CountDownLatch
获取AQS state 数量,state等于0继续执行,state大于0入队自选挂起等待被唤起
Semaphore
计算AQS state与acquire资源之差 若remain小于0 表示资源不足入对等待挂起,若remain>0 CAS方式改变state
ReentrantLock
重入锁 若锁已被当前线程持有,则count+1并立刻返回执行后续。若锁被其他线程持有 进入AQS阻塞队列。
ReentrantReadWriteLock
重入锁 高16位代表读锁 低16位代表写锁
写锁获取
state不为0->低16位不为0->是否为本线程获取->本线程获取cas+1返回true 否则 进入AQS阻塞队列
获取读锁
state低16位为0->高16位cas+1->acquire返回true
网友评论