《java并发编程实战》基础构建模块(二)

并发容器

ConcurrentHashMap使用粒度很细的分段锁(Lock Striping)加锁机制来实现共享,提高了并发性和伸缩性。在这种机制中,任意数量的读取线程可以并发地访问Map,执行读取操作和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map。

ConcurrentHashMap中一些需要在整个Map上进行计算的方法,例如size和isEmpty,由于size返回的结果在计算时可能已经过期了,实际上可能只是一个估计值。这也是一些需要权衡的因素。

在大多数情况下,用ConcurrentHashMap来代替同步Map能进一步提高代码的可伸缩性。只有当应用程序需要加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap。

CopyOnWriteArrayList用于替代同步List,在某些情况下它提供了更好的并发性能。当迭代操作远多于修改操作时,才应该使用“写入时复制”容器。这个准则很好地描述了许多事件通知系统:在分发通知时需要迭代已注册监听器链表,并调用每一个监听器,在大多数情况下,注册和注销事件监听器的操作远少于接收事件通知的操作。故在基于回调的事件机制中,可以考虑使用这个来提高一下性能。

阻塞队列和生产者-消费者模式

阻塞队列提供了可阻塞的put和take方法以及一个offer方法,如果数据项不能被添加到队列中,那么将返回一个失败状态。这样就可以创建灵活和策略处理负荷过载的情况,例如减轻负载,将多余的工作项序列化并写入磁盘,减少生产者线程的数量,或者通过某种方式来抑制生产者线程。

PriorityBlockingQueue是一个按优先级排序的队列,当你希望按照某种顺序而不是FIFO处理元素时,这个队列非常有用。



你可能感兴趣的:(《java并发编程实战》基础构建模块(二))