本文已参与「新人创作礼」活动,一起开启掘金创作之路。
JUC同步锁
1. LongAdder
- 分段锁,分为片断来上锁
- 也就是把不同的线程进行分组,最后再进行统计加和
- 底层每个线程也是CAS操作
2. ReentrantLock
- lockInterruptibly:表示抢锁的时候,可以被设标志位打断抢锁
- Condition:本质就是等待队列,ReentrantLock可以有多个等待队列,用于执行不同的事情
- 公平锁与不公平锁 ○ 默认是非公平锁,可以传入一个boolean来决定 ○ 公平锁是指才来的线程需要去队列排队,不能直接抢锁,保证线程获取到资源的概率一致 ○ 非公平锁会先去抢锁,没有抢到才会去队列
- tryLock ○ 用来控制获取不了锁的情况 ○ 成功获取则返回true;获取失败则返回false ○ 也可以设置时间,去抢多久,抢不到怎么办
- synchronized和ReentrantLock的区别 ○ ReentrantLock底层是CAS,synchronized具有锁升级机制,可以升级到重量级锁 ○ synchronized不需要手动上锁和解锁,ReentrantLock需要 ○ synchronized只有非公平锁
3. ReentrantReadWriteLock(读写锁)
- 包含一把读锁和一把写锁,由高16位和低16位来决定,高16位为读锁,低16位为写锁
- 读锁也就是共享锁,我读的时候别人可以读,但是不能写
- 写锁也就是排他锁,我写的时候别人不能写也不能读
4. LockSupport
- 主要用于对线程执行暂停(park)和唤醒(unpark)操作
- unpark可以先于park使用,则执行的park的时候就不会阻塞
JUC同步工具类
1.CountDownLatch(门栓)
- 用来计数等待线程结束,结束多少线程,干什么事,和join相比,可以在一个线程里面释放多个门栓
2.CyclicBarrier(栅栏)
- 满了多少人之后,放栅栏,干什么事情,也就是满多少线程之后,执行什么操作,可以用来控制批量操作的顺序
3.Phaser(阶段执行)
- 多个线程一起按照阶段性来执行程序,适用于遗传算法,计算机模仿达尔文进化策略
4.Semaphore(信号灯)
- 灯亮可以执行,灯不亮不能执行,可以指定多个灯,指定几个灯,就可以同时运行几个线程,可以设置公平和非公平,一般用来限流使用
- 谷歌限流框架:Guava RateLimiter
5.Exchanger(交换)
- 两个线程运行到一定的时候交换数据,先执行好的线程进入阻塞等待另外一个线程的执行,只能两两进行
AQS
- 底层是通过CAS + volatile + 模板方法来实现的
- 内部有一个status,是一个volatile修饰的int变量
- status 具体代表什么看子类的实现
- VarHandle: ○ 变量句柄,也就是指向某个变量的引用,可以保证对值的操作是原子性并且线程安全的操作 ○ AQS在JDK9之前用的是反射,在JDK9之后,才加入了VarHandle ○ 反射每次用之前要做检查,而VarHandle底层由c/c++实现,是直接操作的二进制码,所以效率要高很多