JavaSE三代集合总结

126 阅读2分钟

JavaSE三代集合总结

第一代集合

Vector、Hashtable、StringBuffer

  1. 属于线程安全集合类
  2. 虽然线程安全,但效率低下
  3. 使用了synchronized修饰方法保证线程安全

第二代集合(主流)

ArrayList、LinkedList、HashMap、HashSet、TreeMap、TreeSet、StringBulider

  1. 属于线程非安全集合类
  2. 虽然线程不安全,但性能更好
  3. 底层使用synchronized代码块锁,虽然锁住了所有的代码,但是锁在方法里边的

第三代集合

ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet

底层都用了Lock锁,保证安全的同时,性能也很高

  1. ConcurrentHashMap使用了锁分离技术(分段(segment)锁定+Lock锁),

    使用多个锁来控制对hash表的不同部分 (段segment) 进行的修改,采用ReentrantLock锁来实现。如果多个修改操作发生在不同的段上,它们就可以并发进行,从而提高效率。

    ConcurrentHashMap在JDK1.8后有较大的改变,摒弃了segment的概念。

    结构上与HashMap相似,数组+链表改为数组+链表+红黑树。具体查看blog.csdn.net/qq_29051413…

  2. CopyOnWriteArrayList实际上就是CopyOnWrite+Lock锁

    CopyOnWrite容器即写时复制的容器,当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后在新的容器里添加元素,添加完元素后,再将原容器的引用指向新的容器。这样可以对CopyOnWrite容器进行并发读取,而不需要加锁,因为当前容器不会添加任何元素,这是一种读写分离的思想,读和写使用不同的容器。

  3. 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:第一次写博客