Java并发包提供了哪些并发工具类?
我们常说的并发工具包就是java.util.concurrent及其子包,集中了Java并发的各种基础工具类,其中主要包括以下几个方面:
- 提供了比synchronized更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作,比如利用semaphore作为资源控制器,限制同时进行工作的线程数量;
- 各种线程安全的容器,比如最常见的ConcurrentHashMap、有序的ConcurrentSkipListMap,或者通过类似快照机制,实现线程安全的动态数组CopyOnWriteArrayList等;
- 各种并发队列实现,如各种BlockingQueue实现,比较典型的ArrayBlockingQueue、SynchorousQueue或针对特定场景的PriorityBlockingQueue等;
- 强大的Executor框架,可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器。
CountDownLatch:允许一个或多个线程等待某些操作完成;
CyclicBarrier:一种辅助性的同步结构,允许多个线程等待到达某个屏障;
Semaphore:java版本的信号量实现。
♦CountDownLatch和CyclicBarrier
CountDownLatch是不可以重置的,所以无法重用,而CyclicBarrier没有这种限制,可以重用;
CountDownLatch基本操作组合是countDown()和await(),调用await()的线程阻塞等待countDown足够的次数,不管你是在一个线程还是多个线程里countDown,只要次数足够即可。CountDownLatch操作的是事件;
而CyclicBarrier的基本操作组合是await(),当所有的伙伴都调用了await(),才会继续进行任务,并自动进行重置。注意,正常情况下,CyclicBarrier的重置是自动发生的,如果我们调用reset()方法,但还有线程在等待,就会导致等待线程被打扰,抛出BrokenBarrierException异常。CyclicBarrier侧重点是线程,而不是调用事件,它的典型应用场景是用来等待并发结束。