Concurrent*类的设计思想:锁分段技术,Concurrent*类是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,Segment的结构和HashMap类似,是一种数组和链表结构,ConcurrentHashMap中默认是把segments初始化为长度为16的数组
ConcurrentHashMap 是设计为非阻塞的。在更新时会局部锁住某部分数据,但不会把整个表都锁住。同步读取操作则是完全非阻塞的。好处是在保证合理的同步前提下,效率很高。坏处是严格来说读取操作不能保证反映最近的更新。
CopyOnWriteArray*类的设计思想:写入时复制(CopyOnWrite,简称COW)思想
CopyOnWriteArrayList添加的时候是需要加锁的,否则多线程写的时候会Copy出N个副本出来,读的时候不需要加锁,如果读的时候有多个线程正在向CopyOnWriteArrayList添加数据,读还是会读到旧的数据,因为写的时候不会锁住旧的CopyOnWriteArrayListCopyOnWrite并发容器用于读多写少的并发场景。比如白名单,黑名单,商品类目的访问和更新场景
几个要点:
-
实现了List接口
-
内部持有一个ReentrantLock lock = new ReentrantLock();
-
底层是用volatile transient声明的数组 array
-
读写分离,写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array