AQS组件与锁

并发工具类,锁ReetrantLock等都是由Aqs实现

基本组件:LockSupport,part(),unPark(),阻塞和唤醒当前线程

CLH队列锁,大部分系统所用的锁机制,双向链表,每个节点线程都在循环检查前一个节点线程是否释放锁

AQS是CHL的变体实现,公平锁

ReetrantLock有静态内部类sync实现了aqs抽象类,公平锁进入先看闲趣节点有没有释放锁,非公平锁上来直接抢锁,抢不到则进入队列,一旦进入队列则和公平锁一样

aqs模板方法模式

内部维护了一个state所状态0-->1-->0

可以自己继承Lock写内部类sync同步器继承aqs来实现自己的锁,tryAcquire cas01 [排它独占锁setExclusiveOwnerThread(Thread.currentThread)], tryRelease,递归会锁死自己,不可重入

内部维护了一个NODE节点,用来保存线程队列,里面保存了上一节点和下一节点,独占欲非独占标识,传播属性标识,

一个线程站着锁。另一个线程来了没有获取锁,将线程封装成NODE节点方法链表尾部,循环查看上一个节点的锁状态,

获取两次锁失败后进去调用LockSupport.part进入阻塞状态,当别的线程调用release方法释放锁是找到下一个节点调用LockSupport.unPark方法唤醒下一个节点,

获取独占锁的流程

tryAcquireShared和tryReleaseShared共享同步类,read共享锁,state数量扣减

 

Condition内部实现了一个等待队列,await量线程打包成node节点,放入队列,并用LockSupport.park进入阻塞状态,被前一个线程唤醒后signal(全部唤醒是队列中的线程循环全部唤醒)将阻塞队列移动到同步队列排队获取锁

aqs是实现同步锁的组件,是实现线程之间同步的规范,cas是对现在cpu原子比较赋值操作的循环调用

 

分布式高并发可以先用本地锁,抢到本地锁再去抢分布式锁

可重入锁,是将cas维护的state+1的累加操作,重入释放一次扣减一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章