Hashtable 多线程遍历删除的奇怪问题!!
项目中需要将一些对象存放到Hashtable中,当满足一定条件,再移除。同时还会有一个定时器定时检查Hashtable中的值,如果长时间无操作,也会移除Hashtable。
下面是代码模拟:
public class TT { public static void main(String[] args) { //模拟3200次 for(int y=0;y<3200;y++){ Hashtable<Integer, String> hts = new Hashtable<Integer, String>(); for(int i=0;i<300;i++){ hts.put(i, "value="+i); } new Thread(new TestThread2(hts)).start(); new Thread(new TestThread(hts)).start(); } }}public class TestThread implements Runnable { private Hashtable<Integer, String> hts; public TestThread(Hashtable<Integer, String> hts) { this.hts = hts; } @Override public void run() { //移除 hts.remove(1); }}public class TestThread2 implements Runnable { private Hashtable<Integer, String> hts; public TestThread2(Hashtable<Integer, String> hts) { this.hts = hts; } @Override public void run() { // 遍历 //方法1 Iterator<Integer> it = hts.keySet().iterator(); while(it.hasNext()){ int k= it.next(); //此处抛 ConcurrentModificationException System.out.println(k); } //方法2// Enumeration<Integer> e = hts.keys();// while (e.hasMoreElements()) {// int key = e.nextElement(); //多次测试此处不会抛异常// System.out.println(key+"--"+hts.get(key));// } }}