Я должен гарантировать, что при повторении Vector; для этого вектора нет обновления, чтобы избежать ConcurrentModificationException
. Я могу использовать параллельную коллекцию. Но я просто хочу попробовать на Vector. Ниже приведен код, который я написал.Как одновременно изменять вектор
public class TestConcurrentModification1 {
Vector a = new Vector();
public static void main(String[] args) {
final TestConcurrentModification1 obj = new TestConcurrentModification1();
new Thread(){
public void run(){
for(int i = 0; i < 5; i++){
try {
Thread.sleep(1);
} catch (InterruptedException e) {}
obj.a.add(""+i);
}
System.out.println(obj.a);
}
}.start();
new Thread(){
public void run(){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
synchronized (obj.a) {
Iterator itr = obj.a.iterator();
while(itr.hasNext()) {
obj.a.add("TEST");//java.lang.OutOfMemoryError: Java heap space
//itr.remove(); //java.lang.IllegalStateException
}
}
}
}.start();
}
}
Но приведенный выше код бросает 1) OutOfMemoryError
или 2) IllegalStateException
. Не могли бы вы объяснить, что вызывает эти два исключения. И как достичь моей цели - избежать ConcurrentModificationException
на Vector
?
Я должен решить это для Java 1.4.2 или ранее.
Не используйте 'Вектор'. Вместо этого выберите подходящий класс из пакета 'java.util.concurrent'. –
'ConcurrentModificationException' не обязательно для одновременного, как в multi -Thread. Вы не можете добавлять/удалять из коллекции, итерации по ней. Вы можете удалить, если используете сам «Итератор». –
Кроме того, обратите внимание на это Q/A: [Почему класс Java Vector считается устаревшим или устаревшим?] (Http://stackoverflow.com/q/1386275/1065197) –