一、什么是同步类容器和并发容器?
同步类容器:最常见的就如Vector和Hashtable等。其本质就是由Collections.synchronizedList修饰的线程安全的集合。但是这类的集合在早期jdk设计的并没有考虑并发修改的情况,所以在多线程并发的修改容器并迭代读取容器时,容易出现ConcurrentModificationException异常.并且因为内部的方法都是通过synchronized修饰的,本身的性能并不好。
并发容器 :jdk1.5之后提供了多种并发类容器替代同步类容器从而改善性能。诸如ConrrentHashMap,CopyOnWriteArrayList以及各种queue等等。
二、并发类容器
ConcurrentMap接口下有两个重要的实现:
ConcurrentHashMap
ConcurrentSkipListMap(支持并发排序功能,弥补ConcurrentHashMap)
ConcurrentHashMap内部使用段(Segment)来表示不同的部分,每个段都是小的HashTable,它们有自己的锁。只要多个修改发生在不同的段上,它们就可以并发的进行。把一个整体分为16个段(Segment)。也就是最高支持16个线程的并发修改操作。
Copy-On-Write 简称COW,是一种程序设计中的优化策略。
JDK里面的COW有两种,CopyOnWriteArrayList和CopyOnWriteArraySet,COW容器非常有用,可以在非常多场景看见。
什么是CopyOnWrite容器?
CopyOnWrite容器即写时复制的容器,当我们往一个容器添加元素的时候,不直接往当前容器添加,而是将当前容器进行Copy,复制出一个新的容器,然后新的容器里面添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处就是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁。因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。