JavaSE三代集合总结
第一代集合
Vector、Hashtable、StringBuffer
-
属于线程安全集合类
-
虽然线程安全,但效率低下
-
使用了synchronized修饰方法保证线程安全
第二代集合(主流)
ArrayList、LinkedList、HashMap、HashSet、TreeMap、TreeSet、StringBulider
-
属于线程非安全集合类
-
虽然线程不安全,但性能更好
-
底层使用synchronized代码块锁,虽然锁住了所有的代码,但是锁在方法里边的
第三代集合
ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet
底层都用了Lock锁,保证安全的同时,性能也很高
-
ConcurrentHashMap使用了锁分离技术(分段(segment)锁定+Lock锁),
使用多个锁来控制对hash表的不同部分 (段segment) 进行的修改,采用ReentrantLock锁来实现。如果多个修改操作发生在不同的段上,它们就可以并发进行,从而提高效率。
ConcurrentHashMap在JDK1.8后有较大的改变,摒弃了segment的概念。
结构上与HashMap相似,数组+链表改为数组+链表+红黑树。具体查看blog.csdn.net/qq_29051413…
-
CopyOnWriteArrayList实际上就是CopyOnWrite+Lock锁
CopyOnWrite容器即写时复制的容器,当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后在新的容器里添加元素,添加完元素后,再将原容器的引用指向新的容器。这样可以对CopyOnWrite容器进行并发读取,而不需要加锁,因为当前容器不会添加任何元素,这是一种读写分离的思想,读和写使用不同的容器。
-
CopyOnWriteArraySet
因为它的底层包含了一个CopyOnWriteArrayList,所以几乎所有操作都是借助CopyOnWriteList,就像HashSet包含HashMap一样。相比CopyOnWriteArrayList,CopyOnWriteArraySet不能添加重复的元素。具体查看 www.cnblogs.com/xiaolovewei…
线程安全
就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。
线程不安全
就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。
可以使用synchronized关键字加锁同步控制。
相关资料连接
synchronized原理 zhuanlan.zhihu.com/p/377423211
synchronized与lock区别 zhuanlan.zhihu.com/p/180469207
ConcurrentHashMap变动 blog.csdn.net/qq_29051413…
CopyOnWriteArrayList原理、优缺点、使用场景 blog.csdn.net/u010002184/…
CopyOnWriteArraySet原理 www.cnblogs.com/xiaolovewei…
StringBuffer和StringBuilder区别详解 blog.csdn.net/weixin_4539…
ps:第一次写博客