Condition的使用及原理
在synchronized里面是wait/notify
在condition里面是await/signal
AQS里面的方法
condition状态-2,封装成节点。该节点既是firstWaiter,也是lastWaiter,后续有节点加入,nextWaiter指向下个节点
调用wait阻塞时候要释放锁,释放锁fullyRelease,重入次数
释放后会唤醒线程
判断是否在同步队列中,如果不在同步队列中,说明当前没有被唤醒
只有aqs队列中才存在prev和aqs关系
阻塞后从同步队列进入condition’队列
通过自旋方式,循环遍历
判断是否中断,中断唤醒,判断是否在aqs队列
如果线程a不在队列中,说明阻塞
然后signal去唤醒,
先判断当前获得锁的线程是否是当前线程
如果当前线程状态是-2,通过cas原子操作更新为0
将当前node添加到aqs队列中,将节点从condition队列中移除掉。线程又进入aqs队列,又去抢占锁,唤醒线程
CountDownLatch原理
计数器,允许线程一直等待,通过计时阻塞
阻塞1000个线程,然后countDown后释放,模拟高并发场景
await/countDown
await
共享锁
等于0,释放
semaphore
AQS限流 令牌
限流操作
aquire共享锁实现
阻塞队列
MQ,消息队列
线程池中会用到
Atomic
原子操作
基于cas
int++,线程递增操作,无法保证原子性,所以使用atomicinteger
用到乐观锁,通过乐观锁方式解决原子性