ConcurrentHashMap 内部使用段来表示这些不同的部分,每一个段就是一个小的hashTable,每一个段有自己的锁
整体分成16个段,最高支持16个线程并发修改,这种方式是减小锁的粒度从而降低竞争的一种方案
ConcurrentSkipListMap (支持并发排序,弥补了ConcurrentHashMap)
使用的话和HashMap差不多。
Copy-On_Write (COW)是一种程序中的优化策略
COW有两种容器:CopyOnWriteArrayList和CopyOnWriteSet
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,
然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,
因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
(通俗讲就是复制一个副本,修改在副本上修改,删除,添加,等副本修改好了 ,直接把原来的引用指向副本(副本也就是成为原来的主本),这种就不存在锁的竞争这类的问题了)
注意:这种方式在读多写少的时候用,如果写多的话拷贝副本的成本是非常昂贵好资源的,不一定起到高效的作用
并发Queue,jdk提供了两套实现: 1.ConcurrentLinkedQueue,非阻塞算法(代表了高性能队列,试用于高并发的场景下,通过无锁的方式,他的性能要好于BlockingQueue)。
ConcurrentLinkedQueue两个重要的方法
add()和offer()都是加入元素
poll和peek()都是取出,区分在前一个是取出后删除,后一个不会
2.BlockingQueue 阻塞算法,实现类如下
ArrayBlockingQueue,其构造函数必须带一个int参数来指明其大小
LinkedBlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的大小由Integer.MAX_VALUE来决定
PriorityBlockingQueue,其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序