线程安全的集合类(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...

相关推荐
fire-flyer34 分钟前
Spring Boot 源码解析之 Logging
java·spring boot·spring·log4j·logging
遥不可及~~斌38 分钟前
Spring Boot RESTful API 设计指南:查询接口规范与最佳实践
spring boot·后端·restful
KoiHeng2 小时前
部分排序算法的Java模拟实现(复习向,非0基础)
java·算法·排序算法
cui_hao_nan5 小时前
JVM——如何对java的垃圾回收机制调优?
java·jvm
熟悉的新风景7 小时前
springboot项目或其他项目使用@Test测试项目接口配置-spring-boot-starter-test
java·spring boot·后端
心平愈三千疾7 小时前
学习秒杀系统-实现秒杀功能(商品列表,商品详情,基本秒杀功能实现,订单详情)
java·分布式·学习
玩代码7 小时前
备忘录设计模式
java·开发语言·设计模式·备忘录设计模式
BUTCHER58 小时前
Docker镜像使用
java·docker·容器
岁忧8 小时前
(nice!!!)(LeetCode 面试经典 150 题 ) 30. 串联所有单词的子串 (哈希表+字符串+滑动窗口)
java·c++·leetcode·面试·go·散列表
晴空月明8 小时前
分布式系统高可用性设计 - 监控与日志系统
后端