Java Hashtable多线程操作遍历问题

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错
最近发现程序经常报出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)

未经允许不得转载:演道网 » Java Hashtable多线程操作遍历问题

赞 (0)
分享到:更多 ()
已有 0 条评论