java同步集合与并发集合区别在哪?知识详解

BSO 2020-12-01 14:46:52 java常见问答 6908

java中关于集合阐释的还是比较详细的,这也是java学习中的一个比较重要的知识点,不知道大家都掌握了吗?即使是集合也是有区别的呢,一起来看看吧。

首先说一下,synchronized vs Concurrent Collections

不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性,还有他们如何实现的线程安全。同步HashMap, Hashtable, HashSet, Vector, ArrayList相比他们并发的实现(比如:ConcurrentHashMap, CopyOnWriteArrayList, CopyOnWriteHashSet)会慢得多。

造成如此慢的主要原因是锁, 同步集合会把整个Map或List锁起来,而并发集合不会。并发集合实现线程安全是通过使用先进的和成熟的技术像锁剥离。比如ConcurrentHashMap会把整个Map划分成几个片段,只对相关的几个片段上锁,同时允许多线程访问其他未上锁的片段。

同样的,CopyOnWriteArrayList允许多个线程以非同步的方式读,当有线程写的时候它会将整个List复制一个副本给它。

如果在读多写少这种对并发集合有利的条件下使用并发集合,这会比使用同步集合更具有可伸缩性。

然后是,Synchronized Collections vs Concurrent Collections in Java

同步集合类,Hashtable和Vector还有同步集合包装类,Collections.synchronizedMap()和Collections.synchronizedList()提供了一个基本的有条件的线程安全的Map和List的实现。

所以Hashtable和ConcurrentHashMap的区别是什么,他们都可以在多线程环境中使用,但一旦Hashtable的大小变得相当大的时候,其性能会降低,因为迭代的时候会被长时间锁定。

然而有一些因素导致他们不适合在高并发应用程序中使用,最主要的原因是在他们的‘集合范围’的锁是程序可伸缩性的一个阻碍。它往往成为必须在相当长一段时间内对集合加锁以防止在迭代期间出现ConcurrentModificationException。

ConcurrentHashMap和CopyOnWriteArrayList不一定在所有地方都是有用的,一般情况下你只需要使用HashMap或ArrayList。

因为ConcurrentHashMap引入了分片的概念,所以无论集合有多大,她都只对特定的片段进行加锁以保障线程安全,其他的读线程仍然可以访问map而不用等待正在访问的线程遍历结束。

可以看出了,关于同步集合以及并发集合之间的区分还是很明显的,这也是我们平时在学习过程中可以了解到的。java基础知识还有很多,想要了解的话,敬请关注奇Q工具网。

推荐阅读:

java集合框架线程同步代码是怎样的?实例详解

java中常见并发集合有哪些?详细解析

java阻塞队列有哪些?同步集合类有哪些?