并发的往IdentityHashMap中put数据时,可能会没有put进去。 可以用下面这段groovy脚本验证。
两个线程同时往map中put字符串,立刻又get这个字符串,key是同一个对象,但有时会返回null。 如果uncomment掉synchronize语句就不会有这个问题。
import com.alibaba.fastjson.util.IdentityHashMap;
String key = "kkkkkkkkkkkkkkkk"
IdentityHashMap map = new IdentityHashMap(2)
Random ran = new Random()
new Thread() {
public void run() {
while(true) {
String kk = key + ran.nextInt(2)
// synchronized(map) {
map.put(kk, kk);
// }
Object val = map.get(kk)
if(val == null) {
println "found"
}
}
}
}.start();
new Thread() {
public void run() {
while(true) {
String kk = key + ran.nextInt(2)
// synchronized(map) {
map.put(kk, kk);
// }
Object val = map.get(kk)
if(val == null) {
println "found"
}
}
}
}.start();