HashMap线程不安全主要体现在扩容方法上
测试:
import java.util.HashMap;
public class Test {
public static final HashMap<String, String> hashMap=new HashMap<String, String>();
public static void main(String[] args) {
Thread t1 = new Thread(){
@Override
public void run() {
for (int i = 0; i < 25; i++) {
hashMap.put(i+"", i+"");
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
for (int i = 25; i < 50; i++) {
hashMap.put(i+"", i+"");
}
}
};
t1.start();
t2.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 50; i++) {
System.out.println(i+"/"+hashMap.get(i+""));
}
}
}
0/null
1/null
2/null
3/null
4/null
5/null
6/null
7/null
8/null
9/null
10/null
11/null
12/null
13/null
14/null
15/null
16/null
17/null
18/null
19/null
20/null
21/null
22/null
23/null
24/null
25/null
26/null
27/null
28/null
29/null
30/null
31/null
32/null
33/null
34/null
35/null
36/null
37/37
38/38
39/39
40/40
41/41
42/42
43/43
44/44
45/45
46/46
47/47
48/48
49/49
扩容方法会把一个oldtable里面的值赋值到newtable中,并且把oldtable值变为null,当多个线程同时进行这个操作时候后面的线程会覆盖前面线程以及赋值过的元素