Java并发编程 之 HashMap线程不安全

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MakeContral/article/details/78203607

我想在平时的多线程编程中,容器的使用是很普遍的,但是你有没有考虑过有些容器是不安全的,如Haspmap、ArrayList。这里讲解一下Hashmap不安去体现在哪里。

插入时不安全:

如果有两个线程A和B,都进行插入数据,刚好经过哈希计算后得到的哈希码是一样的,即插入的位置是一样的。

假设,线程A通过判断,该位置没有哈希冲突,还没有进行数据插入的时候,CPU就把资源让给了线程B。这时候线程B判断该位置也没有哈希冲突,线程A的数据还没插入,就把数据插入了,运行完毕后。线程A因为已经判断过所以直接插入。这时候,线程A把线程B插入的数据给覆盖了。发生了线程不安全情况。

扩容不安全:

Hashmap的初始容量为16。加入新的键值超过限值的时候会调用一个resize操作。

当多个线程同时检测到总数量超过门限值的时候就会同时调用resize操作,各自生成新的数组并rehash后赋给该map底层的数组table,结果最终只有最后一个线程生成的新数组被赋给table变量,其他线程的均会丢失。

线程安全的容器有:vector、concurrentHashMap、Hashtable。StringBuffer也是线程安全的。这就意味着如果在单线程中使用这些线程安全的容器,效率较其他非线程安全容器的会来的慢点。

猜你喜欢

转载自blog.csdn.net/MakeContral/article/details/78203607