Java并发之集合类
2021/6/7 22:35:26
本文主要是介绍Java并发之集合类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、JDK集合类
1.1 ArrayList
基本特点:基于数组,便于按照index访问,超过数组需要扩容,扩容成本较高。
原理:使用数组模拟列表,默认大小10,扩容1.5倍
安全问题:多线程写慧重读,多线程读写也会冲突。多线程下会抛ConcurrentModificationException异常。
1.2 LinkedList
基本特点:使用链表实现,无需扩容
用途:不知道容量,插入变动多的情况
原理:使用双向指针将所有节点连起来
List线程安全的简单办法:
- ArrayList的方法都加上synchronized
- Collections.synchronizedList,强制将 List 的操作加上同步
- Arrays.asList,不允许添加删除,但是可以set替换元素
- Collections.unmodifiableList,不允许修改内容,包括添加删除和set
那么除了以上的办法还有其他的方法吗?接下来就来介绍一些线程安全的集合类
1.3 CopyOnWriteArrayList
基本特点:线程安全的ArrayList
原理:写加锁,保证写不会混乱。写在一个Copy的副本上,而不是原始数据上。写完之后将原来数组的引用指向新副本。(用volatile保证切换过程对读线程立即可见)
1、插入元素,在新副本操作,不影响旧引用
2、删除元素时
- 删除末尾元素,直接使用前N-1个元素创建新数组
- 删除其他位置元素,创建新数组,将剩余元素复制到新数组
3、读取时直接读取,无锁
4、使用迭代器的时候,直接拿当前的数组对象做一个快照,此后的List元素变动,就跟这次的迭代没关系了。
1.4 HashMap
基本特点:空间或时间,哈希冲突不大的情况下查找数据性能很高。
原理:使用hash原理,存放k-v数据,初始容量16,扩容时2倍,负载因子0.75.JDK8以后,在链表长度到8&数组长度到64时,使用红黑树。
1.5 LinkedHashMap
基本特点:继承自HashMap,对Entry集合添加了一个双向链表
用途:保证有序,特别是java8 stream 操作的toMap时使用
原理:同LinkedList,包括插入顺序和访问顺序
1.6 ConcurrentHashMap
java7里面:默认16个Segment,用于降低锁粒度。也就是我们说的分段锁。
java8里面:采用的synchronized+cas实现
这篇关于Java并发之集合类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南