Java并发编程实战(二)基础构建模块

来源:互联网 发布:超时空拦截知乎 编辑:程序博客网 时间:2024/06/05 11:05

基础构建模块主要要解决的问题是:构造线程安全将线程安全性委托给现有的线程安全类。

Java平台类库提供了很多并发基础构建模块。了解一些并发构建模块和使用模式。

怎么样通过Java平台类库去构建线程安全的程序。


本章与第一章的联系和区别:

第一章说明的是基础,本章是在第一章基础上封装的一些应用,我们在编写客户端程序的时候需要使用本章已经封装好的一些程序再应用。


基础构建模块有:

1、同步容器类

Vector和HashTable,Collections.synchronizedXxx

实现方式:同步方法,串行化

在复合操作的时候,可支持客户端加锁保护

存在问题:如果迭代等待时间过长会导致,锁上的竞争激烈,降低吞吐量和CPU的利用率。


2、并发容器

java5.0

ConcurrentHashMap=》替代基于散列的Map

实现原理:分段锁,hash值,key和value


CopyOnWriteArrayList=》遍历为主要操作时替代List

CopyOnWriteArraySet替代Set

实现原理:写入时复制,只要正确的发布一个事实不可变的对象,那么在访问该对象时就不再需要进一步的同步。在每一次修改时,都会创建并重新发布一个新的容器副本,从而实现可变性。

使用注意事项:当迭代操作远远多于修改操作时,才应该使用写入时复制容器。eg:事件监听器。


Queue队列

用来临时保存一组等待处理的元素。


BlockingQueue阻塞队列

提供了可阻塞的put和take方法,以及支持定时的offer和poll方法。

无界队列和有界队列

生产者-消费者模式(解耦,构建资源管理机制)

BlockingQueue的几种实现:LinkedBlockingQueue=》linkedList和ArrayBlockingQueue=》ArrayList(FIFO)


3、同步工具类

可以是任何一个对象,只要它根据其自身的状态来协调线程的控制流。

几种同步工具类:

阻塞队列(BlockingQueue)

信号量(Semaphore)

栅栏(Barrier)

闭锁(Latch)

4、构建高效且可伸缩的结果缓存

缓存:提高吞吐量,消耗内存

讨论分析:使用HashMap和同步机制来初始化缓存

用hashMap保存缓存数据,如果没有则计算返回,如果已经存在则直接返回。

(1)sychronized同步方法,确保hashMap的同步性。

(2)为了提高性能,使用ConcurrentHashMap替换HashMap

(3)考虑到可能两个线程同时计算传过来相同的参数,则先确保等待一个线程计算完成后,在去取缓存。使用闭锁FutureTask。

FutureTask:表示一个计算的过程,这个过程可能已经计算完成,也可能正在进行。如果有结果可用,那么FutureTask.get将立即返回结果,否则它会一直阻塞,直到结果计算出来再将其返回。






原创粉丝点击