多线程下TreeMap访问造成CPU过载

本文介绍了一个webapp项目在多线程环境下使用TreeMap导致服务器运行缓慢的问题及解决方案,包括使用synchronized和ConcurrentSkipListMap的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现webapp项目在客户的server运行几个小时后,会出现整个Server运行很慢,CPU高达100%,刚开始一直认为是哪里内存泄露,但一看该应用占用的内存并没有一直增长,也保持在一个合理的状态。
在排查故障的过程中,发现代码中使用public static TreeMap<String, String> treemap = new TreeMap<String, String>();来记录状态信息,并且发现multi thread put/get访问该对象,就联想到HashMap是非线程安全,是否TreeMap也是呢?上某度一查,结果还真是。
那如何修改呢?Oracle官网http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6423457建议使用ConcurrentHashMap来替换,线程安全,并且查询效率比TreeMap高。但由于项目中需要对该Map按自然顺序或自定义顺序遍历键,刚好需要用到TreeMap的特性–排序,因此可以在方法上加syncronized 或者定义如下TreeMap

public static Map<String,String> treemap = Collections.synchronizedMap(new TreeMap<String,String>());

修改后再在客户server上运行,该问题就解决了。
但诚如@qq_31279701所说,这样的性能实在太差了,可以使用ConcurrentSkipListMap。这是一个支持高并发度的有序哈希表,并且是无锁的,可在多线程环境下替代TreeMap。JDK1.6开始就已经支持ConcurrentSkipListMap。
感谢@qq_31279701的提醒与指正!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值