读书人

Java Concurrent Programming (六)

发布时间: 2012-09-02 21:00:34 作者: rapoo

Java Concurrent Programming (6)
6. 并发集合类
Hashtable是一个易于使用,线程安全的集合类,它的线程安全性是凭借代价换来的--Hashtable中的所有方法都是同步的。HashMap是Hashtable的继承者,通过一个不同步的基类和一个同步的包装器Collections.synchronizedMap解决了线程安全性问题。通过将基本的功能从线程安全性中分离开来,Collections.synchronizedMap允许需要同步的用户可以拥有同步,而不需要同步的用户不需要为同步付出代价。Hashtable和Collections.synchronizedMap通过同步每个方法获得线程安全。这意味着当一个线程执行一个 Map 方法时,无论其他线程要对 Map 进行什么样操作,都不能执行,直到第一个线程结束才可以。 这样,就会有两个不足之处:首先,可伸缩性差,因为一次只能有一个线程可以访问hash表。其次,许多公用的混合操作仍需要外部同步,比如put-if-absent操作,必须要外部同步来保证数据的争用。java.util.concurrent 包添加了多个新的线程安全集合类(ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet)。这些类的目的是提供高性能、高度可伸缩性、线程安全的基本集合类型版本。

6.1 ConcurrentHashMap类
ConcurrentHashMap类是对 Map 的线程安全的实现,比起 synchronizedMap 来,它提供了好得多的并发性。多个读操作几乎总可以并发地执行,ConcurrentHashMap的读操作并不需要加锁,是因为其HashEntry被定义为final(HashEntry代表每个hash链中的一个节点),而value被修饰为volatile的原因:

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>    implements BlockingQueue<E>

因为队列的大小没有界限,使得添加可以立即返回,但是在延迟时间过去之前,不能从队列中取出元素。如果多个元素完成了延迟,那么最早失效/失效时间最长的元素将第一个取出。
SynchronousQueue 类是最简单的。它没有内部容量。它就像线程之间的手递手机制。在队列中加入一个元素的生产者会等待另一个线程的消费者。当这个消费者出现时,这个元素就直接在消费者和生产者之间传递,永远不会加入到阻塞队列中。 1 楼 jilen 2011-05-20 内容有点多啊。光ConcurrentHashMap就可以写出一篇文章。你这里ConcurrentHashMap Iterator弱一致是指,迭代时段内一致,而其他段则可能被修改,这个意思么? 2 楼 Technoboy 2011-06-16 jilen 写道内容有点多啊。光ConcurrentHashMap就可以写出一篇文章。你这里ConcurrentHashMap Iterator弱一致是指,迭代时段内一致,而其他段则可能被修改,这个意思么?
弱一致指,迭代器可以允许并发修改,当迭代器被创建的时候,它会遍历已有的元素,并且可以感应(但是不保证)到在迭代器被创建后,对容器的修改。

读书人网 >编程

热点推荐