Java-并发容器
1、jdk提供的并发容器包括:
1.1 ConcurrentHashMap:线程安全的Hashmap
1.2 CopyOnWriteArrayList:线程安全的List,在读多写少的场合,远远好于Vector
1.3 ConCurrentLinkedQueue:高效的并发队列,使用链表实现,可以看做一个线程安全的LinkedList,这是一个非阻塞队列。
1.4 BlockingQueue这是一个接口,jdk内部通过链表、数组等方式实现了这个接口,表示阻塞队列,非常适用于做数据共享的通道。
1.5 ConcurrentSkipListMap:跳表实现,这是一个Map,使用跳表进行快速查找。
2、ConcurrentHashMap
在ConcurrentHashMap中,无论是读操作还是写操作都能保证很高的性能;在进行读操作的时候不需要加锁,而在写操作时通过锁分段技术对所操作的端加锁不影响客户端对其他段的访问。
1、jdk1.7将哈希桶切分成最小数组Segment,笑一个小数组有n个HashEntry组成。每一个线程占用锁访问其中一段数据,其他段数据也能被其他线程访问,实现并发。
Segment继承了ReentrantLock,所以Segment也是一种可冲入锁,segment默认是16,并发度也是16
2、JDK1.8:选择了Hashmap相同的数据结构,Node数组+链表+红黑树结构;在锁的实现上抛弃了原来的Segment分段锁,采用的是CAS+Synchronized实现的更加细粒度的锁(如果没有hash冲突采用cas直接插入,如果有hash冲突,就将数组中的元素级别上加一把synchronized锁)
将锁的级别控制在了更细粒度的哈系统数组元素级别,也就是说只需要锁住链表的头结点,或者红黑树的根节点,就不会影响其他的哈希桶数组的读写,大大提高了并发度。
3、JDK1.8使用内置锁Synchronized替换了ReentrantLock锁
3.1:synchronized锁在jdk1.6开始就引入了大量的优化,并且synchronized有多重锁,会从无锁->偏向锁->轻量锁->重量级锁一步一步的转换
3.2:减少内存开销。假设使用可重入锁获得同步的支持,那么每个节点都需要继承AQS来获取同步支持。但并不是每个节点都需要同步支持,只有链表的头结点或者红黑树的根节点需要同步。
4、concurrenthashmap和hashtable效率哪个更高?为什么?
4.1 concurrenthashmap更高,因为hashtable会给整个哈希表加一大把锁。而concurrenthashmap的锁粒度更低,CAS+synchronized。cas保证可见性、synchronized锁头结点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署