juc:java.util.concurrent
AQS是juc的核心,它是多线程访问共享资源的框架,许多同步类的实现都依赖于它,比如CountDownLatch、CyclicBarrier、Semaphore。
CountDownLatch用来控制一个线程或者多个线程等待多个线程。它维护了一个计数器,每次调用countdown方法的时候计数器值就会减1,减到0的时候那些调用await的方法就会被唤醒。
CyclicBarrier和CountDownLatch类似,也是用来控制线程相互等待的,使用计数器来实现。和CountDownLatch不同的是CyclicBarrier中的计数器采用的是加的方式,当计数器的值达到指定的值,所有等待的线程会被唤醒。还有一个区别就是CyclicBarrier通过调用reset方法可以循环使用计数器。
Semaphore类似操作系统中的信号量,它可以控制对互斥资源访问的线程数目。
juc还有一些其他组件,比如FutureTask、BlockingQueue、ForkJoin。
FutureTask可以用于一些异步获取结果的场景。比如一个任务要执行很长时间的话,就可以用FutureTask来封装这个任务,在主线程完成自己的任务以后再去获取结果。
BlockingQueue就是阻塞队列,它提供了take和put方法。如果队列为空的话,使用take将阻塞直到队列中有内容;如果队列为满的话,使用put将阻塞直到队列有空闲位置。它可以用来实现生产者消费者问题。
ForkJoin主要用于并行计算,可以将大的任务拆分成许多小任务并行计算。
参考:https://cyc2018.github.io/CS-Notes/#/notes/Java%20%E5%B9%B6%E5%8F%91?id=blockingqueue