В следующем фрагменте кода я попробовал как с Hashtable
, который называется потокобезопасным, так и HashMap
. Но в обоих случаях я получаю ConcurrentModificationExceptionn
. Если это так, то, что преимущества HashTable
над HashMap
в случае безопасности потокаВ чем разница между Hashtable и HashMap, если оба метода выбрасывают ConcurrentModificationException в следующем фрагменте кода?
public class multiThreadedEnv {
static Map<Integer, String> map = new Hashtable<Integer, String>();
//static Map<Integer, String> map = new HashMap<Integer, String>();
static{
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
map.put(4, "Four");
map.put(5, "Five");
}
public static void main(String[] args) {
Thread t1 = new Thread(){
public void run() {
Iterator itr= map.entrySet().iterator();
while(itr.hasNext()){
Entry<String,String> entry=(Entry<String, String>) itr.next();
System.out.println(entry.getKey()+" , "+entry.getValue());
itr.remove();
Thread.sleep(2000);
}
}
};
Thread t2= new Thread(){
public void run() {
Iterator itr= map.entrySet().iterator();
while(itr.hasNext()) {
Entry<String,String> entry=(Entry<String, String>) itr.next();
System.out.println(entry.getKey()+" , "+entry.getValue());
itr.remove();
Thread.sleep(2000);
}
}
};
t1.start();
t2.start();
}
}
Вся причина, по которой 'Hashtable' была по существу устаревшей, заключалась в том, что она сделала вас _think_ у вас была безопасность потоков, когда вы этого не сделали. –
Возможный дубликат [Как отладить ConcurrentModificationException?] (Http://stackoverflow.com/questions/840165/how-to-debug-concurrentmodificationexception) – Raedwald
@LouisWasserman Будьте осторожны, когда вы говорите «Hashtable» и «устарели» в том же когда я в пределах слышимости. :-) –