并发工具类,锁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的累加操作,重入释放一次扣减一次