一次HashMap多线程安全引起的事故
来源:互联网 发布:抢电影票软件 编辑:程序博客网 时间:2024/04/27 19:53
事故分析
最近一次web工程上线,上线大概半个小时,出现了报警,16核的服务器的cpu使用了1123%,程序出异常了。
Cpu利用率过高一般是因为出现了出现了死循环,导致部分线程一直运行。占用cpu时间。使用jstack工具dump出问题的那台服务器的栈信息。死循环的话,首先查找RUNNABLE的线程,找到问题代码如下:
java.lang.Thread.State:RUNNABLE
at java.util.HashMap.get(HashMap.java:303)
atcom.sohu.twap.service.logic.TransformTweeter.doTransformTweetT5(TransformTweeter.java:183)
共出现了23次。
java.lang.Thread.State:RUNNABLE
at java.util.HashMap.put(HashMap.java:374)
atcom.sohu.twap.service.logic.TransformTweeter.transformT5(TransformTweeter.java:816)
共出现了3次。
问题原因已经显而易见。先说说这个Hashmap的使用的方法,在服务器启动之后,第一个访问这个map的时候进行初始化,以后不再变化。hashmap作为TransformTweeter的static成员,也就是类成员。
关键代码:
privatestatic Map<String,String>expressionMap =newHashMap<String, String>();
先来分析初始化方法:
上面的栈信息显示有三个线程在对HashMap进行put操作,这显然是违背了作者的本意的。看798行,expressionMap.size==0 这个判读,在多个线程并发操作的的时候,可能存在(这里用一定也不过分)多个线程进入这段初始化代码。
问题就这样引起了,HashMap是非线程安全的,多个线程put的时候造成了某个key值Entry key List的死循环,问题就这么产生了。
当另外一个线程get 这个Entry List 死循环的key的时候,这个get也会一直执行。最后结果是越来越多的线程死循环,最后导致服务器dang掉。解决办法也很简单,就不多说了
我们一般认为HashMap重复插入某个值的时候,会覆盖之前的值,这个没错。但是对于多线程访问的时候,由于其内部实现机制,就可能出现安全问题了。正如<<并发编程实践>>所说,当某个类没有什么是线程安全的时候,就认为它是非线程安全的。
对HaspMap死循环原因分析
有人已经做出了分析,我就不在大费周章了。链接如下:
问题:http://www.blogjava.net/zhvfeng/archive/2010/08/04/327956.html
分析:http://www.udpwork.com/item/2321.html
https://gist.github.com/rednaxelafx/1081908- 一次HashMap多线程安全引起的事故
- 一次HashMap多线程安全引起的事故
- 一次HashMap多线程安全引起的事故
- 一次HashMap多线程安全引起的事故
- 一次HashMap多线程安全引起的事故
- 一次HashMap多线程安全引起的事故
- 一次由系统mail引起的宕机事故
- 一次共享内存引起的线上事故分析
- 一次DDOS攻击引起的安全漫谈
- HashMap引起的事故:jdk1.7和jdk1.8下的hash函数的不同
- 记一次线上事故,redis 的keys问题,cpu引起的性能问题
- mysql lower_case_table_names 参数引起的一起事故
- HashMap多线程引起的死循环的原因分析
- HashMap实现多线程安全
- 空军某部一次有趣的飞行事故
- 空军某部一次有趣的飞行事故
- 一次生产事故的优化经历
- 一次生产事故的优化经历
- 基于visual Studio2013解决C语言竞赛题之0901文件读写
- 字符串是否是UTF8,UTF8汉字是否被截断?
- [Java] IO-01 FileInputStream / FileOutputStream / FileReader / FileWriter
- xCode5.0使用iOS6.1SDK及模拟器
- apache 搭建网站中文gbk乱码问题解决
- 一次HashMap多线程安全引起的事故
- time_wait状态存在的意义
- 删去字符串中包含的a、e、i、o、u字符
- java中读取文件的方法
- 基于visual Studio2013解决C语言竞赛题之0902文件查找
- linux route命令解析
- Rotating Sentences
- Streaming live H264 video from DM368
- Linux tcp keep-alive