并发容器java
经过并发容器来替代同步容器,提供性能,能够极大地提升伸缩性并下降风险。安全
Java 5.0增长了两种新的容器类型:Queue和BlockingQueue。Queue的实现有:ConcurrentLinkedQueue,这是一个传统的先进先出的队列,PriorityQueue(非并发的)优先队列。Queue上的操做不会阻塞,若是队列为空,获取队列元素的操做将返回空值。并发
BlockingQueue扩展了Queue,增长了可阻塞的插入和获取操做。若是队列为空获取元素的操做,那么获取队列元素的操做将一直阻塞,直到队列出现一个可用的元素。若是队列已满(对于有界队列来讲),那么插入元素的操做将一直阻塞,直到队列中出现可用的空间。性能
ConcurrentHashMap与HashMap同样也是基于散列的Map,可是它彻底使用了不用的加锁策略来提供更高的并发性和可伸缩性。ConcurrentHashMap并非在每一个方法上都使用同一个锁来同步,而是使用了一种粒度更细的加锁机制来实现更大程度的共享,也就是分段锁。在这种机制中,任意数量的线程能够并发地访问Map,执行读取的线程和写入的线程能够并发的进行,而且必定数量的写入线程能够并发地修改Map。ConcurrentHashMap容器在迭代的时候不会抛出ConcurrentModificationException,所以不须要在迭代的过程加锁。ConcurrentHashMap返回的迭代器具备弱一致性(Weakly Consistent),而并不是“即便失败”。弱一致性的迭代器能够容忍并发的修改,当建立迭代器时会遍历全部的元素,并能够(但不保证)在迭代被构建后修改操做反应给容器。尽管这样,任然仍是有权衡的因素。对于须要在对整个Map进行计算的方法,例如size和isEmpty,这些方法的语义被略微减弱了以反应容器的并发特性。size在计算结果时可能已通过期了,它其实是一个估计值,所以size返回的是一个近似值不是精确值。.net
额外的原子操做线程
ConcurrentHashMap不能被加锁来进行独占的访问,所以咱们没法使用客户端加锁来建立新的原子操做。这些复合操做都实现了原子操做,例如“若没有则添加”,“若相对则移除(Remove-If-Equal)”和“若相等则替换(Replace-If-Equal)”等。对象
CopyOnWriteArrayList队列
CopyOnWriteArrayList用于替换同步List,在某些状况下提供了更好的并发性能。而且迭代期间不须要对容器进行加锁或复制。“写入时复制(Copy-On-Write)”容器的线程安全在于,只要正确的发布一个事实的不可变对象,那么访问该对象就不须要加锁同步。每次修改时,都会建立并从新发布一个新的容器副本,从而实现可变性。“写入时复制”容器迭代操做不会抛出ConcurrentModificationException,而且返回时的元素与迭代器建立时的元素彻底一致,而没必要考虑以后修改操做带来的影响。“写入时复制”容器修改操做须要必定的开销,因此仅当迭代操做远远多于修改操做的时候,才应该使用它。get