美文网首页JAVA面试必备基础知识点
第二十章、JAVA并发工具类

第二十章、JAVA并发工具类

作者: 小母牛不生产奶 | 来源:发表于2018-11-03 23:32 被阅读20次

JAVA并发包工具类有哪些?

在java中,并发包也就是java.util.concurrent及其子包,计中了java并发的各种基础工具类,具体主要包括几个方面:

1、提供了比synchronized更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作,比如利用Semaphore作为资源控制器,限制同时进行工作的线程数量。

2、各种线程安全的容器,比如最常见的ConcurrentHashMap、有序的ConcunrrentSkipListMap、或者通过类似快照机制,实现线程安全的动态数组CopyOnWriteArrayList等。

3、各种并发队列实现,如各种BlockedQueue实现,比较典型的ArrayBlockingQueue、SynchorousQueue或针对特定场景的PriorityBlockingQueue等。

4、强大的Executor框架,可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器。


多线程编程的目的?

1、利用多线程提高程序的扩展能力,以达到业务对吞吐量的要求;

2、协调程序间调度、交互,以完成业务逻辑;

3、线程间传递数据和状态,这同样时实现业务逻辑的需要。


实战

CountDownLatch,允许一个或多个线程等待某些操作完成;

CyclicBarrier,一种辅助性的同步结构,允许多个线程等待到达某个屏障。

Semaphore,java版本的信号量实现。

java提供了经典信号量(Semaphore)的实现,它通过控制一定数量的允许(permit)的方式,来达到限制通用资源访问的目的。可以想象这个场景:子啊车站、机场等出租车时,当很多空出租车就位时,为防止过度拥挤,调度员指挥排队等待坐车的队伍一次进来5个人上车,等这5个人坐车出发,再放进去下一排,这和Semaphore的工作原理有些类似


CountDownLatch和CyclicBarrier的行为有一定的相似度,经常会被考察两者有什么区别:

1、CountDownLatch是不可以重置的,所以无法重用;而CyclicBarrier则没有这种限制,可以重用;

2、CountDownLatch的基本操作组合是countDown/await。调用await的线程阻塞等待countDown足够的次数,不管你是一个线程还是多个线程里countDown,只要次数足够即可,所以CountDownLatch操作的是事件。

3、CyclicBarrier的基本操作组合是await,当所有的伙伴(parties)都调用了await,才会继续进行任务,并自动进行重置。注意,正常情况下,CyclicBarrier的重置都是自动发生的,如果我们调用reset方法,但还有线程在等待,就会导致等待线程被打扰,抛出BrokenBarrierException异常。CyclicBarrier侧重点是线程,而不是调用时间,它的典型应用场景是用来等待并发线程结束。

如果CountDownLatch去实现排序场景,该怎么做尼?假设有10个人排队,我们将其分成5个人一批,通过CountDownLatch来协调批次

图一 图二 图三 输出结果

如果用CyclicBarrier来表达这个场景的话,我们知道CyclicBarrier其实反映的是线程并行运行时的协调,在下面的示例里,从逻辑上,5个工作线程其实更像是代表了5个可以就绪的空车,而不是5个乘客,对比前面CountDownLatch的例子更有助于我们区别他们的抽象模型


图一 图二 输出结果

Java并发包提供的线程安全 Map、List 和 Set

总体上种类和结构还是比较简单的:

如果我们的应用侧重于Map放入或者获取的速度,而不在乎顺序,大多推荐使用ConcurrentHashMap,反之则使用ConcurrentSkipListMap;

如果我们需要对大量数据进行非常频繁地修改,ConcurrentSkipListMap也可能表现出优势。

相关文章

网友评论

    本文标题:第二十章、JAVA并发工具类

    本文链接:https://www.haomeiwen.com/subject/rhylxqtx.html