线程安全的集合类(ConcurrentHashMap面试超高频考点)

🧵多线程环境下使用ArrayList

✨自己使用同步机制synchronized或者ReentrantLock

🎉使用Collections.synchronizedList(new ArrayList); synchronizedList是标准库提供的一个基于synchronized进行线程同步的List,synchronizedList的关键操作上都带有synchronized来满足线程安全

🎊使用CopyOnWriteArrayList CopyOnWrite容器即写时复制容器: 当往一个容器中添加元素的时候,不往该容器中直接添加元素,而是先将该容器进行复制一个新的容器,添加的时候往复制的容器中添加 添加完后,将原容器中的引用指向新复制的容器 CopyOnWrite容器是一种读和写分离的思想,读和写的容器是不同的

优点:在读多写少的情况下,性能高

缺点:占有内存多,新写的数据不能被第一时间读到

🎡多线程环境下使用队列(Queue)

使用阻塞队列

🥎ArrayBlockingQueue,基于数组实现的阻塞队列

🏀LinkedBlockingQueue,基于链表实现的阻塞队列

🏐PriorityBlockingQueue,基于堆实现的带优先级的阻塞队列

⚽TransferQueue,最多只包含一个元素的阻塞队列

🎑多线程环境下使用哈希表(面试超高频考点)

HashMap是线程不安全的,在多线程下使用线程安全的哈希表可以使用:

🎺HashTable
🪗ConcurrentHashMap

🏅HashTable

HashTable的底层实现只是对关键方法加上synchronized

HahTable的底层数据结构为数组+链表

这样加锁相当于对HashTable对象本身加锁即对整个数组加锁,将整个数组锁住了,如果多个线程同时访问同一个HashTable对象,就会出现竞争锁,造成锁冲突

缺点: 因为方法加上了锁,所以每次使用的时候都要获取锁,释放锁,性能效率比较低下

🎖️ConcurrentHashMap

底层数据结构为数组+链表+红黑树,红黑树会和链表在某种条件下互相发生转换

⁉️关于ConcurrentHashMap如何实现线程安全:

⏰对于读操作,因为读操作本身就为线程安全的,对于ConcurrentHashMap的属性使用了volatile关键字修饰,确保每次读的值为主存中的最新值

⏲️对于写操作,写操作仍然使用synchronized加锁,但是锁的不是整个数组,如果数组中是链表,锁头结点,如果数组中是红黑树,锁根节点,这样大大降低了锁冲突发生的概率,即多个线程操作不同的结点还是并发并行执行的,操作同一个结点才是互斥的

🕰️充分利用CAS特性,如果结点为空,CAS+自旋,如果结点有元素,synchronized(头节点),size属性也是通过CAS来更新的,这样避免出现重量级锁的情况

🎃对于扩容操作:

⚽需要创建一个新数组,线程发现需要扩容,就搬几个元素到新数组

🏐新老数组是同时存在的

🏀后续的线程也会参与搬几个元素到新数组的过程

🥎待老数组的所有元素都搬完删除老数组

🏉对于扩容的操作,插入只往新数组中插查找需要同时查找新数组和老数组

🎯面试题:HashTable,HashMap,ConcurrentHashMap的区别?

🕐HashMap,线程不安全,key允许为null

🕑HashTable,线程安全,使用synchronized锁整个HashTable对象,效率低,key不允许为null

🕒ConcurrentHashMap,线程安全,对于属性使用了volatile关键字,使用synchronized锁每个链表的头结点降低锁冲突的发生率,充分利用了CAS特性,优化扩容方式,key不允许为null

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:cloud.tencent.com/developer/s...

相关推荐
流星521122几秒前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
csdn_aspnet几秒前
Java 圆台体积和表面积计算程序(Program for Volume and Surface area of Frustum of Cone)
java
杯莫停丶7 分钟前
设计模式之:外观模式
java·设计模式·外观模式
乐之者v8 分钟前
Mac常用软件
java·1024程序员节
TDengine (老段)27 分钟前
TDengine 数据函数 ROUND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·1024程序员节
TDengine (老段)30 分钟前
TDengine 数学函数 RAND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
從南走到北30 分钟前
JAVA无人自助共享系统台球室源码自助开台约球交友系统源码小程序
java·微信·微信小程序·小程序·1024程序员节
烟袅35 分钟前
告别 var!深入理解 JavaScript 中 var、let 和 const 的差异与最佳实践
javascript·面试
野犬寒鸦41 分钟前
从零起步学习MySQL || 第十章:深入了解B+树及B+树的性能优势(结合底层数据结构与数据库设计深度解析)
java·数据库·后端·mysql·1024程序员节
上进小菜猪43 分钟前
智能信创新范式:浙江省人民医院的全栈国产化与智能数据底座实践
后端