hashMap线程不安全的原因及表现
来源:互联网 发布:新闻网站源码 手机版 编辑:程序博客网 时间:2024/04/29 07:39
hashMap出现线程不安全的原因:
HashMap
的实现里没有锁的机制,因此它是线程不安全的。
其实只要有锁的机制,可以通过锁实现线程安全,我们在读写HashMap
对象的时候加锁,以保障这个对象的线程安全,但不代表HashMap
本身是线程安全的,因为是外力(你自己加的锁)使然。
为啥不在HashMap内部加锁让它变成线程安全?
这样会增加单线程访问的资源消耗,即使没有多线程访问,也要每次检查、加锁、解锁。
实际上有线程安全的Map,Collections
里面有个静态方法可以返回一个线程安全版本的HashMap
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return new SynchronizedMap<K,V>(m); }
另外java5之后还提供了ConcurrentHashMap
类,提供更高效的线程安全操作。
HashMap
的实现里没有锁的机制,因此它是线程不安全的。
其实只要有锁的机制,可以通过锁实现线程安全,我们在读写HashMap
对象的时候加锁,以保障这个对象的线程安全,但不代表HashMap
本身是线程安全的,因为是外力(你自己加的锁)使然。
为啥不在HashMap内部加锁让它变成线程安全?
这样会增加单线程访问的资源消耗,即使没有多线程访问,也要每次检查、加锁、解锁。
实际上有线程安全的Map,Collections
里面有个静态方法可以返回一个线程安全版本的HashMap
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return new SynchronizedMap<K,V>(m); }
另外java5之后还提供了ConcurrentHashMap
类,提供更高效的线程安全操作。
hashMap出现线程不安全的表现:
表现1:
多个线程同时操作一个hashmap就可能出现不安全的情况:
比如A B两个线程(A线程获数据 B线程存数据) 同时操作myHashMap1.B线程执行存放数据
modelHashMap.put("1","2");
2.A线程执行get获取数据
modelHashMap.get("1")
A线程获取的值本来应该是2,但是如果A线程在刚到达获取的动作还没执行的时候,
线程执行的机会又跳到线程B,此时线程B又对modelHashMap赋值 如:modelHashMap.put("1","3");
然后线程虚拟机又执行线程A,A取到的值为3,这样map中第一个存放的值 就会丢失。。。。。
要保证值的准确,就要保证操作的原子性,就是保证A操作从头开始不能被打断。。所有要用同步关键字,或者使用java 1.5中的current新包中的ConcurrentHashMap,这是线程安全的,在java最新的并发包中,对之前非线程安全的工具,如hashMap List 都做了同步封转。
表现2:
一般我们声明HashMap时,使用的都是默认的构造方法:HashMap<K,V>,看了代码你会发现,它还有其它的构造方法:HashMap(int initialCapacity, float loadFactor),其中参数initialCapacity为初始容量,loadFactor为加载因子,而之前我们看到的threshold = (int)(capacity * loadFactor); 如果在默认情况下,一个HashMap的容量为16,加载因子为0.75,那么阀值就是12,所以在往HashMap中put的值到达12时,它将自动扩容两倍,如果两个线程同时遇到HashMap的大小达到12的倍数时,就很有可能会出现在将oldTable转移到newTable的过程中遇到问题,从而导致最终的HashMap的值存储异常。
表现3:
构造entry<K,V>单链表时,也会出现不安全的情况。
- hashMap线程不安全的原因及表现
- hashMap线程不安全的原因及表现-2
- HashMap线程不安全原因
- HashMap的线程不安全体现
- 关于Servlet的线程不安全的原因及防范方法
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- 证明HashMap是线程不安全的
- HashMap为什么是线程不安全的
- HashMap为什么是线程不安全的?
- 谈谈HashMap线程不安全的体现
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- 浅谈iOS尺寸单位pt、ppi与px
- js运动-运动缓冲
- 第一天学闭包
- 5. Training versus testing
- Tarjan
- hashMap线程不安全的原因及表现
- 整理一下当年的学习笔记之:SpringMVC的各种参数绑定方式
- easyUI NumberBox
- 解决iframe之间的间隙问题
- CodeForces 317D Game with Powers
- Java控制循环语句break、continue、return介绍
- 使用HashSet存储10个1-20之间的随机数,并且要求随机数不重复。
- java中this的用法(2)
- Bayesian trained NN