Java并发编程 之 HashMap线程不安全
2017-10-11 14:50
281 查看
我想在平时的多线程编程中,容器的使用是很普遍的,但是你有没有考虑过有些容器是不安全的,如Haspmap、ArrayList。这里讲解一下Hashmap不安去体现在哪里。
假设,线程A通过判断,该位置没有哈希冲突,还没有进行数据插入的时候,CPU就把资源让给了线程B。这时候线程B判断该位置也没有哈希冲突,线程A的数据还没插入,就把数据插入了,运行完毕后。线程A因为已经判断过所以直接插入。这时候,线程A把线程B插入的数据给覆盖了。发生了线程不安全情况。
当多个线程同时检测到总数量超过门限值的时候就会同时调用resize操作,各自生成新的数组并rehash后赋给该map底层的数组table,结果最终只有最后一个线程生成的新数组被赋给table变量,其他线程的均会丢失。
线程安全的容器有:vector、concurrentHashMap、Hashtable。StringBuffer也是线程安全的。这就意味着如果在单线程中使用这些线程安全的容器,效率较其他非线程安全容器的会来的慢点。
插入时不安全:
如果有两个线程A和B,都进行插入数据,刚好经过哈希计算后得到的哈希码是一样的,即插入的位置是一样的。假设,线程A通过判断,该位置没有哈希冲突,还没有进行数据插入的时候,CPU就把资源让给了线程B。这时候线程B判断该位置也没有哈希冲突,线程A的数据还没插入,就把数据插入了,运行完毕后。线程A因为已经判断过所以直接插入。这时候,线程A把线程B插入的数据给覆盖了。发生了线程不安全情况。
扩容不安全:
Hashmap的初始容量为16。加入新的键值超过限值的时候会调用一个resize操作。当多个线程同时检测到总数量超过门限值的时候就会同时调用resize操作,各自生成新的数组并rehash后赋给该map底层的数组table,结果最终只有最后一个线程生成的新数组被赋给table变量,其他线程的均会丢失。
线程安全的容器有:vector、concurrentHashMap、Hashtable。StringBuffer也是线程安全的。这就意味着如果在单线程中使用这些线程安全的容器,效率较其他非线程安全容器的会来的慢点。
相关文章推荐
- HashMap为什么线程不安全以及解决方法
- java单例模式和HashMap的线程安全
- ConcurrentHashMap-----不安全线程hashmap-安全线程-hashtable
- java并发编程与线程安全
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- HashMap为什么是线程不安全的?
- 谈谈HashMap线程不安全的体现
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的
- 谈谈HashMap线程不安全的体现
- hashmap线程不安全在哪里?
- 解决hashmap线程啊安全问题的三个解决方案
- HashMap为什么线程不安全
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- HashMap为什么线程不安全(hash碰撞与扩容导致)
- HashMap为什么是线程不安全的
- HashMap为什么是线程不安全的?
- Java并发编程(Java Concurrency)(9)- 线程安全与共享资源(Thread Safety and Shared Resources)
- Java HashMap笔记之二:线程不安全原理
- HashMap为什么是线程不安全的?