Jakie są możliwe problemy spowodowane dodaniem elementów do niezsynchronizowanego obiektu z wieloma wątkami jednocześnie?Jakie są możliwe problemy spowodowane jednoczesnym dodawaniem elementów do niezsynchronizowanego obiektu ArrayList przez wiele wątków?
Próbowałem uruchomić kilka eksperymentów ze statyczną tablicą ArrayList z wieloma wątkami, ale nie mogłem znaleźć wiele.
Tutaj spodziewam się wielu skutków ubocznych niezsynchronizowania ArrayList lub podobnych obiektów w środowisku wielowątkowym.
Każdy dobry przykład pokazujący efekty uboczne byłby znaczący. dzięki.
poniżej to mój mały eksperyment, który przebiegał płynnie bez żadnego wyjątku.
Zastanawiam się również, dlaczego nie rzucił żadnych ConcurrentModificationException
?
import java.util.ArrayList;
import java.util.List;
public class Experiment {
static List<Integer> list = new ArrayList<Integer>();
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("A " + i);
new Thread(new Worker(list, "" + i)).start();
}
}
}
class Worker implements Runnable {
List<Integer> al;
String name;
public Worker(List<Integer> list, String name) {
this.al = list;
this.name = name;
}
@Override
public void run() {
while (true) {
int no = (int) (Math.random() * 10);
System.out.println("[thread " + name + "]Adding:" + no + "to Object id:" + System.identityHashCode(al));
al.add(no);
}
}
}
Ponieważ dokumentacja stwierdza: "Ten wyjątek może zostać zgłoszony metodami, które wykryły współbieżną modyfikację obiektu **, gdy taka modyfikacja nie jest dopuszczalna. ***" AFAIK, 'ArrayList' nie wymusza reguł, aby tego nie zabronić. To "Iterator" robi. Jeśli chcesz zobaczyć wyniki, spróbuj usunąć elementy z jednego z wątków, podczas gdy inni dodają i zobacz, czy wyniki są zgodne z oczekiwaniami. W tej chwili wszystkie wątki są po prostu dodawane do listy (i drukowane, gdy tylko się do niej dodadzą, co stanowi największą wadę tego testu), więc nie można oczekiwać, że konsola będzie wyświetlać dziwne wyniki. –
Twoje wątki są w rzeczywistości nieco zsynchronizowane z powodu 'System.out.println' ... – assylias
Re," Próbowałem przeprowadzić kilka eksperymentów ... ale nie mogłem znaleźć wiele. " To sprawia, że błędy współbieżności są tak podstępne: czasami mogą być trudne do odtworzenia. Czasami program, który zezwala na wątki niezsynchronizowanego dostępu do współużytkowanych danych, może przetrwać miesiące testów, tylko po to, aby zawiesić się w witrynie klienta po jej zwolnieniu. (Nie pytaj mnie, skąd wiem!) –