Java并发编程—结合源码分析ConcurrenthashMap与CopyOnWriteArrayList的原理
2020/2/22 17:02:52
本文主要是介绍Java并发编程—结合源码分析ConcurrenthashMap与CopyOnWriteArrayList的原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Java并发编程
代码GitHub地址 github.com/imyiren/con…
- 刨根问底搞懂创建线程到底有几种方法?
- 如何正确得启动和停止一个线程 最佳实践与源码分析
- 多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
- 了解线程属性,如何处理子线程异常
- 多线程安全和性能问题
- JMM(Java内存模型)在并发中的原理与应用
- 深入理解死锁问题及其解决方案
- 剖析线程池的使用与组成
- 带你一文搞懂ThreadLocal的用法以及内部原理
- J.U.C下Lock的分类及特点详解(结合案例和源码)
- J.U.C下各种Atomic类使用及CAS相关源码分析
- 结合源码分析ConcurrenthashMap与CopyOnWriteArrayList的原理
- 并发流程控制与AQS原理及相关源码解析
0. 主要内容
- 文章主要部分分析了两个并发容器的代表:ConcurrenthashMap和CopyOnWriteArrayList
1. 并发容器
1.1 常用的并发容器
- ConcurrentHashMap:线程安全的HashMap
- CopyOnWriteArrayList:线程安全的List
- BlockingQueue:阻塞队列(实现类:ArrayBlockingQueue、LinkedBlockingQueue等)
- ConcurrentLinkedQueue:非阻塞并发队列,链表实现,可看做线程安全的LinkedList
- ConcurrentSkipListMap:使用跳跃链表实现的Map
1.2 早期的并发集合
-
Vector和HashTable
- 内部方法全部用synchronized做同步,并发性能差得一批!
-
HashMap和ArrayList
-
虽然这两个类不是线程安全的,但是可以用
Collections
的synchronizedList(list)
和synchronizedMap(map)
包装使之变成线程安全的 -
但是实质上,里面还是用
synchronized
实现, 以map
为例:看源码:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return new SynchronizedMap<>(m); } 复制代码
private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable { ...... SynchronizedMap(Map<K,V> m) { this.m = Objects.requireNonNull(m); mutex = this; } ...... public int size() { synchronized (mutex) {return m.size();} } public boolean isEmpty() { synchronized (mutex) {return m.isEmpty();} } public boolean containsKey(Object key) { synchronized (mutex) {return m.containsKey(key);} } ...... 复制代码
- 我们可以看到源码中,虽然
synchronized
不是加在方法上,但是其实每个方法都是在调用对应map的方法并在外层包裹synchronized
-
1.3 现在的并发集合
ConcurrenthashMap
和CopyOnWriteArrayList
- 用于取代同步的
HashMap
和ArrayList
以及HashTable
和Vector
这些容器 - 多数条件下
这篇关于Java并发编程—结合源码分析ConcurrenthashMap与CopyOnWriteArrayList的原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 用于取代同步的
- 2024-07-04TiDB 资源管控的对撞测试以及最佳实践架构
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现