HashMap多线程并发情况(JDK1.8)
很早就知道Hashmap是线程不安全的,并且也看过hashmap的源码,知道他的各个操作的过程,今天来实践下,在多线程的情况下,hashmap的哪些步骤会出问题。
测试程序,扩容重哈希时的典型状况。
很简单,跑五个线程不停的往map里面put数据就好了,为了防止变量操作在多线程下对实验产生干扰,我们使用AtomicInteger来操作。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicInteger;
public class HashThreadTest extends Thread{
static HashMap<Integer, Integer> map=new HashMap<Integer, Integer>(1);
static AtomicInteger aInteger=new AtomicInteger();
public void run(){
while(aInteger.get()<10000){
map.put(aInteger.get(), aInteger.get());
//sysout操作非常耗时,加入将很难遇到冲突。
//System.out.println(Thread.currentThread().getName()+"put了: "+aInteger.get());
aInteger.incrementAndGet();
}
}
public static void main(String[] args) throws InterruptedException {
HashThreadTest t=new HashThreadTest();
Thread[] threads=new Thread[5];
for (int i = 0; i < 5; i++) {
threads[i]=new Thread(t,"线程"+i);
threads[i].start();
}
//默认还有个守护线程
while (Thread.activeCount() > 2) {
// Thread.currentThread