JUC同步锁 同步工具类 AQS底层

152 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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++实现,是直接操作的二进制码,所以效率要高很多