Że jeden wątek widzi coś innego niż drugi. Coś co może wystąpić przy optymalizacjach JVM jeżeli korzystasz z zmiennej wewnątrz obiektu która nie jest oznaczona volatile. lol
Bzdury,
Wątek A tworzy ArrayListe - wywoływany jest konstruktor i poprawnie stworzony obiekt jest widoczny dla wszystkich wątków (jest OK - JMM nam to gwarantuje) - następnie do tej listy dodawana jest zmienna X, referencja jest przekazywana do następnego (JUŻ istniejącego - to ważne bo thread.start() nawiązuje happened-before relation) wątku - dalej - już mam nie konsystencje bo aktualny wątek nie musi widzieć dodanej wcześniej zmiennej, bo nic nie wywołało store barrier (czyli widzi coś INNEGO niż poprzedni).
Coś co może wystąpić przy optymalizacjach JVM
Od kiedy JVM zarządza cachami procesora ? Ty masz na myśli reordering a pole oznaczone volotile najzwyczajniej odpala store barrier na pisaniu i load barrier na czytaniu, to nie blokuje JVMa przed optymalizacjami... reordering w przypadku o którym piszę nie będzie miał żadnego znaczenia bo operacje następują po sobie sekwencyjnie, mogą mieć JEDYNIE różny stan obiektów w pamięci(cache).
forEach
), modyfikuje obiekt, który pochodzi z poza jej zakresu. W bytecodzie masz wielokrotne wywołanie metody w rodzajulambdaWForEach(this, doubleOfEven)
. Modyfikacja listy, która jest parametrem metody.