Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
2. Sprzętowa obsługa współbieżności ...................................................................... 327
15.3. Klasy zmiennych niepodzielnych ......................................................................... 331
15.4. Algorytmy nieblokujące ....................................................................................... 335
Podsumowanie ............................................................................................................... 342
Rozdział 16. Model pamięci Javy ...................................................................... 343
16.1. Czym jest model pamięci i dlaczego ma mnie interesować? ............................... 343
16.2. Publikacja ............................................................................................................. 350
16.3. Bezpieczeństwo inicjalizacji ................................................................................. 355
Podsumowanie ............................................................................................................... 356
Dodatki ...................................................................... 357
Dodatek A Adnotacje związane ze współbieżnością ........................................ 359
A.1. Adnotacje dla klas .................................................................................................. 359
A.2. Adnotacje pól i metod ............................................................................................ 360
Dodatek B Bibliografia .................................................................................. 361
Skorowidz .................................................................................... 365
Rozdział 3.
Na początku rozdziału 2. pojawiło się stwierdzenie, że poprawne programy współbieżne muszą przede wszystkim właściwie zarządzać dostępem do współdzielonego, zmiennego stanu. Tamten rozdział dotyczył użycia synchronizacji do zabezpieczenia się przed wieloma wątkami korzystającymi z tych samych danych w tym samym momencie.
Ten prezentuje techniki współdzielenia i publikacji obiektów, by były bezpieczne do stosowania w wielu wątkach. Razem oba elementy stanowią podstawę tworzenia klas bezpiecznych wątkowo i poprawnej konstrukcji współbieżnych aplikacji za pomocą klas biblioteki java.util.concurrent.
W poprzednim rozdziale przedstawiliśmy, w jaki sposób bloki i metody synchronized zapewniają niepodzielność operacji. Wielu osobom wydaje się, że te bloki dotyczą tylko niepodzielności i oznaczania sekcji krytycznych. Synchronizacja ma także inny istotny, choć subtelny, aspekt — widoczność pamięci. Chcemy nie tylko zapewnić, by gdy jeden wątek modyfikuje stan obiektu, inne mu w tym nie przeszkadzały, ale i to, by inne wątki rzeczywiście widziały dokonaną zmianę. Nie można tego osiągnąć bez synchronizacji. Obiekty są bezpiecznie publikowane czy to za pomocą jawnej synchronizacji, czy przez zastosowanie synchronizacji wybudowanej w klasy biblioteki.
3.1. Widoczność
Widoczność to subtelny temat, bo zadania, które mogą się nie udać, są mało intuicyjne.
W środowisku jednowątkowym, gdy zapisujemy wartość do zmiennej i później ją od-czytujemy (w międzyczasie nie było innych zapisów), możemy się spodziewać otrzy-mania tej samej wartości. Wydaje się to w miarę naturalne. Z tego względu początkowo trudno zaakceptować, że w przypadku wielu odczytów i zapisów z wielu wątków przedstawione założenie może nie zaistnieć. Ogólnie nie ma gwarancji, iż wątek odczytujący zobaczy wartość zapisaną przez inny wątek w odpowiednim czasie, a nawet w ogóle. Aby zapewnić widoczność zapisów do pamięci w różnych wątkach, należy użyć synchronizacji.
46
Część I ¨ Podstawy