1.多线程使用场景
主要用在我们的批量存入和多路召回中,需要对数据进行一个并行处理
2.锁
2.1 Synchronized
本质上是通过monitor对对象进行监控,内部
onwner:负责指向持有对象的线程
EntryList:代表进入的线程
WaitList:代表等待的线程
同步对象和同步代码块不同之处是:对对象通过设置access_flags的ACC_SYNCHRONIZED标志位来实现,而同步代码块则通过monitorenter和monitorexit实现
2.1.1 锁升级
JVM 使用了锁升级的优化方式,就是先使用偏向锁优先同一线程然后再次获取锁,如果失败,就升级为 CAS 轻量级锁,如果失败就会短暂自旋,防止线程被系统挂起。最后如果以上都失败就升级为重量级锁。
2.2 AQS也叫队列同步器
state:线程是否被占用,0不占用;1占用
Node:同步等待队列
Condition:条件等待队列,可以有多个
2.2.1 ReentrantLock
内部有公平锁和非公平锁两种实现,差别就在于新来的线程是否比已经在同步队列中的等待线程更早获得锁。
2.2.2 CountDownLatch
内部是通过实现一个AQS的同步队列实现的,在初始化创建CountDownLatch时,会传入参数state,代表剩余计数的次数,每次有线程执行完成会执行一次countDown即state减1,直到state为0时,当前线程回去唤醒阻塞队列里的所有线程。