https://blog.csdn.net/weixin_44717284/article/details/131233782
AQS分为独占锁和共享锁。
ReentrantLock(独占锁):可重入,可中断,可以是公平锁也可以是非公平锁。(公平锁:锁被释放之后,先申请的线程先得到锁。非公平锁:锁被释放之后,后申请的线程可能会先获取到锁,时随机获取按照其他优先级排序的。)设定 state 初始值为 0,表示未锁定状态。A 线程 lock() 时,会调用 tryAcquire() 独占该锁并将 state + 1。此后,其他线程再 tryAcquire() 时就会失败,直到 A 线程 unlock() 到 state = 0(即释放锁)为止,其它线程才有机会获取该锁。释放锁之前,A 线程自己是可以重复获取此锁的(state 会累加),即可重入的概念。
Semaphore(信号量):设定一个信号量,当调用 acquire() 时判断是否还有信号,有就获取一个信号量,没有就阻塞等待其他线程释放信号量,当调用 release() 时释放一个信号量,唤醒阻塞线程。
应用场景:允许多个线程访问某个临界资源时,如上下车,买卖票
CountDownLatch(倒计数器):给计数器设置一个初始值,当调用 countDown() 时计数器减 1,当调用 await() 时判断计数器是否归 0,不为0就阻塞,直到计数器为0。
应用场景:启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行
CyclicBarrier(循环栅栏):给计数器设置一个目标值,当调用 await() 时会计数 + 1 并判断计数器是否达到目标值,未达到就阻塞,直到计数器达到目标值。
应用场景:多线程计算数据,最后合并计算结果的应用场景。