JAVA基础——HashMap线程安全

HashMap在多线程环境下并非线程安全,可能导致数据丢失、链表成环和fail-fast问题。解决办法包括使用ConcurrentHashMap、synchronizedMap、Hashtable或自定义线程安全的实现。Java 8对HashMap的实现优化了扩容机制,减少了链表成环的可能性。
摘要由CSDN通过智能技术生成

接触过HashMap的人应该对线程安全问题都不陌生,就算是没踩过多线程下HashMap的坑,起码在学习的过程中应该也听说过是非线程安全的,几乎你问每一个程序员hashmap是不是线程安全的,大家都会告诉不是的,那么我来从个人层面探讨一下看似人人都懂的线程安全问题。

首先,hashmap线程安全吗?答案显然是否定的,在java中如果你想要在多线程中安全的使用map的话,目前我所知道的有四种:

1.juc包下的ConcurrentHashMap,提到ConcurrentHashMap这里又是涉及了许多思想,线程安全,数据结构等问题的一个map类,后面有机会的话会好好写文章分析一下这个并发安全的map类。我相信如果有多线程编程经验的同学应该也大多数是采用了ConcurrentHashMap。

2.调用Collections 工具包下的Collections.synchronizedMap()方法可以返回一个线程安全的map,点进源码可以方法,这个方法实现线程安全的方法其实是在类内部维护了一个Object mutex,在所有对map的操作方法里都加入了对mutex这个对象的同步处理进而保证线程安全。

3.使用hashtable。非常不推荐使用hashtable,原因很简单,看看源码你就会发现,这个类的实现非常简单粗暴,就是把所有方法都加入了synchronized关键字保证线程安全的,在多线程下效率会受到较大影响。

4.当然了,我们也可以不依靠java内置的类,通过自己开发map类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值