hashMap的线程不安全】的更多相关文章

一直以来都知道HashMap是线程不安全的,但是到底为什么线程不安全,在多线程操作情况下什么时候线程不安全? 让我们先来了解一下HashMap的底层存储结构,HashMap底层是一个Entry数组,一旦发生Hash冲突的的时候,HashMap采用拉链法解决碰撞冲突,Entry内部的变量: final Object key; Object value; Entry next; int hash; 通过Entry内部的next变量可以知道使用的是链表,这时候我们可以知道,如果多个线程,在某一时刻同时…
我们在学习 HashMap 的时候,都知道 HashMap 是非线程安全的,同时我们知道 HashTable 是线程安全的,因为里面的方法使用了 synchronized 进行同步. 但是 HashMap 为什么是非线程安全的呢?难道仅仅就是因为内部的方法没有 synchronized 关键字修饰吗?这篇文章主要来分析一下原因. 我们知道 HashMap 底层是一个 Entry 数组,当发生 hash 冲突的时候,HashMap 是采用链表的方式来解决的,在对应的数组位置存放链表的头结点.对链表…
1. HashMap 的线程不安全性的体现: 主要是下面两方面: (1)多线程环境下,多个线程同时resize()时候,容易产生死锁现象.即:resize死循环 (2)如果在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,即:fail-fast策略 2. resize死循环: (1)为什么会出现resize死循环? 在单线程情况下,只有一个线程对HashMap的数据结构进行操作,是不可能产生闭合的回路的.那就只有在多线程并发的情…
hashMap是非线程安全的,表现在两种情况下: 1 扩容: t1线程对map进行扩容,此时t2线程来读取数据,原本要读取位置为2的元素,扩容后此元素位置未必是2,则出现读取错误数据. 2 hash碰撞 两个线程添加元素发生hash碰撞,都要将此元素添加到链表的头部,则会发生数据被覆盖. 详情: HashMap底层是一个Node数组,一旦发生Hash冲突的的时候,HashMap采用拉链法解决碰撞冲突,Node结构: /** * Basic hash bin node, used for most…
我们都知道.HashMap是非线程安全的(非同步的).那么怎么才能让HashMap变成线程安全的呢? 我认为主要可以通过以下三种方法来实现: 1.替换成Hashtable,Hashtable通过对整个表上锁实现线程安全,因此效率比较低 2.使用Collections类的synchronizedMap方法包装一下.方法如下: public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)  返回由指定映射支持的同步(线程安…
在前面我的一篇总结(6. 线程范围内共享数据)文章中提到,为了数据能在线程范围内使用,我用了 HashMap 来存储不同线程中的数据,key 为当前线程,value 为当前线程中的数据.我取的时候根据当前线程名从 HashMap 中取即可. 因为当初学习 HashMap 和 HashTable 源码的时候,知道 HashTable 是线程安全的,因为里面的方法使用了 synchronized 进行同步,但是 HashMap 没有,所以 HashMap 是非线程安全的. 在上面提到的例子中,我想反…
前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密. 1.jdk1.7中的HashMap 在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况: 1 public class HashMapTest { 2 3 public static void main(String[] ar…
作者:developer http://cnblogs.com/developer_chan/p/10450908.html 我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密. 1.jdk1.7中的HashMap 在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况: public c…
http://www.blogjava.net/lukangping/articles/331089.html final HashMap<String, String> firstHashMap = new HashMap<String, String>(); Thread t1=new Thread(){ public void run() { for(int i=0;i<25;i++){ firstHashMap.put(String.valueOf(i), Strin…
通过各方资料了解,HashMap不是线程安全的,但是为什么不是线程安全的,在什么情况下会出现问题呢? 1. 下面对HashMap做一个实验,两个线程,并发写入不同的值,key和value相同,最后再看看value和key是否相等. import java.util.HashMap; public class TestHashMap { public static final HashMap<String, String> hashMap = new HashMap<String, Str…