Mam troszkę czasu i przeglądam stare pytania... Także tego :P
Czy mógłby ktoś mi jeszcze bardziej rozjaśnić różnice między volatile a Synchronized? W uproszczeniu rozumiem, że Volatile wymusza na wątku thread sprawdzanie zgodności jego wersji (kopii) zmiennej z oryginałem czyli powoduje, że wątek (który będzie używał tej zmiennej) będzie rozpatrywał zmiany zmiennej gdyby w inny wątek go zmieniał, zaś Synchronized (użyte na metodzie), blokuje dostęp innym metodom z tego samego obiektu do działania na wspólnych zmiennych.
Właściwie to sam sobie odpowiedziałeś, ale postaram się coś dodać.
Modyfikator volatile sprawia że każdy wątek który posługuje się tą zmienną ma przy niej napisane ostrzeżenie - "Uważaj - bo może ona zmienić wartość nawet wtedy, gdy się nie spodziewasz!" Wątek ten może spać przez 3 milisekundy, a w tym czasie nagle zmienna ta może zmienić wartość. Jeśli jednak ta zmienna będzie oznaczana jako Volatile, to tego wątku to nie zaskoczy, gdyż zawsze będzie on "podejrzliwy" i sprawdzał, co znajduje się pod jej adresm w pamięci. Przychodzi mi do głowy na przykład takie zastosowanie, jak nadanie tego modyfikatora do zmiennej sterującej jakąś pętlą, zmiennej, która jest zmieniana w innym wątku.
Blok kodu oznaczony jako synchronized nie może być wykonywany współbieżnie. Jesli jeden wątek zacznie wykonywać kod z bloku synchronized, to dopóki nie wyjdzie z tego bloku, inne wątki chcące wykonać ten blok będą musiały zaczekać. Pozwala to na rozwiązanie problemu sekcji krytycznej - na "atomowy" dostęp do tego bloku przez n wątków.
Jak widać obydwa rozwiązania służą do czego innego. Modyfikator volatile zapewnia nas że uzywamy najnowszej wartości zmiennej. I tylko tyle. Zmienna ta może być jednocześnie sprawdzana w instrukcji warunkowej oraz modyfikowana. Mogą istnieć 3 wątki, jednocześnie próbujące przypisać jej inną wartość. Natomiast użycie bloku synchronized pozwala na znacznie więcej.
Mam nadzieję, że coś to rozjaśni :P