设为首页 加入收藏

TOP

Java Hashtable多线程操作遍历问题
2014-11-24 08:29:36 来源: 作者: 【 】 浏览:1
Tags:Java Hashtable 线程 操作 问题

最近发现程序经常报出java.util.ConcurrentModificationException异常.发现其一个互斥作用的hashtable线程周期性去除无用key报错,导致hashtable值不断增大.


检测线程为单独线程,每一小时检测一次,使用java的iterator进行遍历.问题就出在iterator.在使用iterator遍历时不能使用原hashtable的put与remove方法,要不就会报java.util.ConcurrentModificationException异常,上锁的话可能会造成性能问题.


经过测试优化的处理方式为改为


Enumeration e1 = T1.map.keys();
while (e1.hasMoreElements()) {
String key = e1.nextElement();
String ret = T1.map.remove(key);
}


以后还是少用iterator为妙.


以下为测试程序,有兴趣可以跑跑


public class T1 extends Thread{
public static Hashtable map = new Hashtable();


public void run() {
super.run();
while(true)
{
for (int i = 0; i < 100; i++) {
map.put(String.valueOf(System.currentTimeMillis())+i, "");
}
System.out.println("add 100---->"+map.size());
Random rd = new Random();
try {
Thread.sleep(rd.nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


public static void main(String[] args) throws InterruptedException {
T1 t1 = new T1();
t1.start();
T2 t2 = new T2();
t2.start();
}
}



public class T2 extends Thread{



public void run() {
super.run();
while(true)
{
System.out.println("map----size 01:"+T1.map.size());
// 异常的逻辑
// Iterator it = T1.map.entrySet().iterator();
// while (it.hasNext()) {
// it.next();
// it.remove();
// }

Enumeration e1 = T1.map.keys();
while (e1.hasMoreElements()) {
String key = e1.nextElement();
String ret = T1.map.remove(key);
}

System.out.println("map----size 02:"+T1.map.size());

Random rd = new Random();
try {
Thread.sleep(rd.nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}


如果有其它更好的方法或意见可以联系我.大家一起讨论一下。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java代码生成MyEclipse注册码 下一篇Android使用GridView实现日历功能..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何从内核协议栈到 (2025-12-27 03:19:09)
·什么是网络协议?有哪 (2025-12-27 03:19:06)
·TCP/ IP协议有哪些 (2025-12-27 03:19:03)
·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)