java hashtable多线程操作遍历问题

本文介绍了一种避免在Java中因并发修改集合而引发ConcurrentModificationException的方法。通过使用Enumeration替代Iterator来遍历并移除Hashtable元素,解决了线程安全问题。

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

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

 

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

 

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

			Enumeration<String> 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<String, String> map = new Hashtable<String, String>();
	
	
	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<String> 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();
			}
		}
	}
	
}

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值