(1) AQS(AbstractQueuedSynchronizer)概念: 有三个元素
1. volatile int state
2. 双向队列
3. CAS操作
(2) CountDownLatch
1.countDownLatch继承了AQS
2.其构造方法传入参数,state=其参数
3.当其他线程调用countDown()方法的时候,CAS(Unsafe.compareAndSetState)得将state-1,如果发现state=0的时候,会唤醒在双向队列中的线程LockSupport.unpark(s.thread).
4.当主线程调用await()方法的时候,发现state=0,那么就返回。如果发现state>0,那么就会添加到双向队列中,但是其中又自旋了一遍,查看是否state=0了,等于0就将节点从双向队列中删除,且return。否则就LockSupport.unpark(this).
(3) ReentreenLock
1.ReentreenLock继承AQS,只讲非公平锁
- 非公平-> 在获取时先cas改变一下 AQS 的state值, 改变成功就获取, 不然就加入到 AQS 的 Sync Queue 里面
- 每次获取lock之前判断是否 AQS 里面的 Sync Queue 是否有等待获取的线程
2.lock方法,
尝试CAS更改state变成1&#