Java HashMap的并发问题
使用Java的同学应该都是知道HashMap是线程不安全的,不能够并发的去put和get,如果有并发操作,会抛出ConcurrentModificationException这个异常。不过可能很多同学没有注意,这个异常并不是一定会抛出的。而并发的去对HashMap对象进行put和get的结果,是可能造成死循环。
?? ? 年前在线上,也遇到了这么一次。当时是有同学找过来,说有台机器的load很高,已经启动了流量控制,也没有请求进到容器中。后来dump了thread,也通过top -H看到占用CPU比较高的线程,发现都是在执行HashMap.get,想到可能就是上面的原因,后来看了源码,发现确实是这么一个问题。
?具体对于HashMap在并发操作时陷入死循环的分析,可以参看这篇博客 http://pt.alibaba-inc.com/wp/dev_related_969/hashmap-result-in-improper-use-cpu-100-of-the-problem-investigated.html
我这里想说的主要不是说应该用什么的问题,而是提醒大家有这么个事情在。尤其是经常处理线上问题的同学。很多代码都不是我们自己写的。 3 楼 invincibleLiu 2011-05-06 synchronized(map){
if(...){
wait();
}
map.put();
notifyall();
}
synchronized(map){
if(...){
wait();
}
map.get();
notifyall();
}
1.这种Pascal式的做法做跟推荐的ConcurrentHashMap有什么区别?性能上的还是......
2.淘宝这样的大型电子商务平台不是强调分布式吗?能否举个Map在实际情况应用的例子