Wpis z mikrobloga

@wkoloprzegrywy: Sposobów jest kilka, wszystko zależy od tego jak wygląda twój kod (Thread.join(), CountDownLatch, ExecutorService.submit) lub coś w tym stylu:

List list = new CopyOnWriteArrayList<>();
ExecutorService ex = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
ex.execute(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 1000; i++) {
list.add(i);
}
}
});
}
ex.shutdown();
ex.awaitTermination(1, TimeUnit.MINUTES);
ex.shutdownNow();
System.out.println(list.size());
@wkoloprzegrywy: W takich momentach cieszę się że moje #php jest (no prawie całe) jednowątkowe, więc takie problemy tam nigdy nie powstaną.

I ja wiem, że to powyżej to pewnie jakieś denne zadanie na uczelnie, żeby właśnie student zapoznał się z strukturami danych "thread-safe" i pracą z nimi. Pewnie jakieś mutexy, semafory, a koniec końców jak potem próbujesz coś poważniejszego zrobić w ten sposób o pomyłkę nie trudno, pojawiają się śmieci w
@Ununoctium: Dziekuje za obszerne wyjasnienia. Na pewno przydadza sie kiedys jak bedzie wieksza rozkmina jakiej technologii uzyc. Teraz ucze sie do OCP i rozkminiam wielowatkowosc, wiec raczej nie moge dac odpowiedzi nie bedacej na arkuszu "use golang" ( ͡° ͜ʖ ͡°)
@leoha: przygotowuje sie do OCP wiec te wszystkie metody musze przerobic, zastanawialem sie, czy to co chce osiagnac jest mozliwe ze zwykla arraylista i synchronized.
@wkoloprzegrywy: Mylisz się, źródłem problemu jest twój kod. To czy odpalisz go w ramach testu czy jako zwykłą aplikację może jedynie zmienić prawdopodobieństwo wystąpienia błędu, ale w tym kodzie błąd wystąpić może zawsze.

Problemem jest to, że dodajesz do zwykłej ArrayList elementy z wielu wątków. Z uwagi na to, że w wątku dodajesz mało elementów, a wątki tworzysz sam (co jest operacją czasochłonną) to błędy nie pojawiają się cały czas. Po