第69条:并发工具优先于wait和notify
Java 1.5 版本发行之后,Java平台就提供了更高级的并发工具,wait和notify的组合就不主要了。既然正确的使用wait和notify比较困难,就应该用更高级的并发工具来代替。java.util.concurrent包中更高级的工具分成三类:Executor Framework、并发集合(Concurrent Collection)以及同步器(Synchronizer)。
并发集合为标准的集合接口(如List、Queue和Map)提供了高性能的并发实现。为了提供高并发性,这些实现在内部自己管理同步。因此,并发集合中不可能排除并发活动;将它锁定没有什么作用,只会使程序的速度变慢。这意味着客户无法原子的对并发集合进行方法调用。因此有些集合接口已经通过依赖状态的修改操作进行了扩展,它将几个基于操作合并到了单个原子操作中。例如,ConcurrentMap扩展了Map接口,并添加了几个方法,包括putIfAbsent(key, value),当键没有映射时会替它插入一个映射,并返回与键关联的前一个值,如果没有这样的值,则返回null。
ConcurrentHashMap除了提供卓越的并发性之外,速度也非常快。除非不得已,否则应该优先使用ConcurrentHashMap,而不是使用Collections.synchronizedMap或者Hashtable。只要用并发Map替换老式的同步Map,就可以极大地提升并发应用程序的性能。更一般的,应该优先使用并发集合,而不是使用外部同步的集合。
有些集合接口已经通过阻塞操作进行了扩展,他们会一直等待(或者阻塞)到可以成功执