线程完成state–,刚好判断state是否为0,不需要主动轮询一直问state是否为0
ReentrantLock为例:
state初始值0
线程A调用lock()方法,尝试通过tryAcquire()方法独占锁
成功:state+1
失败:线程A进入CLH队列(等待队列,直到其他线程释放该锁
假设成功:释放锁前,线程A自身可以重复获得该锁(state++),state–到0才会让锁回复到未锁定状态
CountDownLatch为例
任务分成N个子线程,state初始化值N
每当一个子线程执行完,countDown()
当state为0,CountDownLatch调用unpark()唤醒主线程,主线程从await()方法返回
countDown():使用CAS让state–
await()方法属于CountDownLatch而不是AQS
AQS&&Exclusive&&Share
Exclusive 独占,ReentrantLock
Share共享,CountDownLatch和Semaphore
Exclusive:tryAcquire-tryRelease
Share:tryAcquireShared-tryReleaseShared
也可同时独占+共享,ReentrantReadWriteLock
ReentrantReadWriteLock:Read共享,Write独占
可自定义
AbstractQueuedSynchronizer