​集合类是怎么解决高并发中的问题?

简介: 普通的安全的集合类 JUC中高并发的集合类ArrayList、 LinkedList、 HashSet、 TreeSet、 HashMap、 TreeMap 实际开发中我们自己用这样的集合最多,因为一般我们自己写的业务代码中,不太涉及到多线程共享同一个集合的问题。

一、集合类是怎么解决高并发中的问题?

普通的安全的集合类

JUC中高并发的集合类

ArrayList LinkedList HashSet TreeSet HashMapTreeMap实际开发中我们自己用这样的集合最多,因为一般我们自己写的业务代码中,不太涉及到多线程共享同一个集合的问题

线程安全的集合类VectorHashTable 虽然效率没有JUC中的高性能集合高,但是也能够适应大部分环境

高性能线程安全的集合类

·  1.ConcurrentHashMap

·  2.ConcurrentHashMap和HashTable的区别

·  3.ConcurrentHashMap线程安全的具体实现方式/底层具体实现

·  4.说说CopyOnWriteArrayList

1.ConcurrentHashMap

java5.0在juc包中提供了大量支持并发的容器类,采用“锁分段”机制,Concurrentlevel分段级别,默认16,就是有16个段(segment),每个段默认又有16个哈希表(table),每个又有链表连着。

640.png


在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争。DK1.8的时候ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。Java 8在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为O(N))转换为红黑树(寻址时间复杂度为O(log(N)))synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。

ConcurrentSkipListMap线程安全有序的哈希表(相当于线程安全的TreeMap); 它继承于AbstractMap类,并且实现ConcurrentNavigableMap接口。ConcurrentSkipListMap是通过“跳表”来实现的

ConcurrentSkipListSet线程安全的有序的集合(相当于线程安全的TreeSet)它继承于AbstractSet,并实现了NavigableSet接口ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的,它也支持并发CopyOnWriteArraySet addIfAbsent和 CopyOnWriteArrayList(写入并复制)也是juc里面的,它解决了并发修改异常,每当有写入的时候,就在底层重新复制一个新容器写入,最后把新容器的引用地址赋给旧的容器,在别人写入的时候,其他线程读数据,依然是旧容器的线程。这样是开销很大的,所以不适合频繁写入的操作。适合并发迭代操作多的场景只能保证数据的最终一致性




目录
相关文章
|
安全 Java 容器
​集合类是怎么解决高并发中的问题?
一、集合类是怎么解决高并发中的问题? 思路 先说一下那些是非安全 普通的安全的集合类
77 0
|
存储 安全 Java
Java集合介绍和使用场景
Java集合介绍和使用场景
106 0
|
4月前
|
存储 安全 Java
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
43 0
|
存储 程序员 容器
面试被问:ArrayList自动扩容机制的实现原理?怎么答?
一位3年工作经验的小伙伴面试时被问到,说请你谈一谈ArrayList自动扩容机制的实现原理。这个问题对于稍微看过一点源码的小伙伴来说,其实非常简单。下面我给大家分享一下我对这个问题的理解。
129 0
|
存储 并行计算 安全
ConcurrentHashMap的使用方法及其内部实现原理
ConcurrentHashMap的使用方法及其内部实现原理
187 0
|
开发框架 PHP
PHPfinal方法的使用场景是什么?底层原理是什么?
PHPfinal方法的使用场景是什么?底层原理是什么?
102 0
集合线程安全问题:第一章:集合类不安全之并发修改异常
集合线程安全问题:第一章:集合类不安全之并发修改异常
127 0
集合线程安全问题:第一章:集合类不安全之并发修改异常
|
安全
HashMap在多线程使用场景下会存在线程安全问题,怎么处理?
HashMap在多线程使用场景下会存在线程安全问题,怎么处理?
175 0
|
Java
关于Java面试中的ArrayList底层结构、底层源码的高频热点面试题解析
关于Java面试中的ArrayList底层结构、底层源码的高频热点面试题解析
130 0
|
存储 SQL 缓存
HashMap的底层原理和线程安全的替代方案
HashMap是基于哈希表的Map接口的非同步实现,常见的数据结构有`堆栈、队列、数组、链表和红黑树`,Java中最基本的数据结构有两种,一种是`数组`,一种是`引用`。可以说其他所有的数据结构都可以从这两个最基本结构构造而来,当然HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即**数组**和**链表**的结合体,所以说HashMap的底层其实就是一个数据结构,被称为`哈希表结构`,数组中的每一项又是一个链表。当新建一个HashMap的时候,内部就会初始化一个数组。
814 0
HashMap的底层原理和线程安全的替代方案