Teoria współbieżności
Informatyka
Laboratorium 2 - monitory w Javie
Monitory w javie
- Związane z każdym obiektem
- Same nie są reprezentowane jako klasy / obiekty!
- Synchronizują dostęp do metod i bloków synchronized
- Dodatkowy monitor związany z klasą - dla metod statycznych
synchronizowanych
Synchronizacja
- Metody synchronized
- Blok synchronized
- użyteczny do synchronizacji dostępu do już istniejących
obiektów, do których nie można dodać żadnych metod
synchronized ( obj ) {
...
obj.method();
...
}
- Zasady synchronizacji
- Wejście do metody synchronizowanej (bloku synchronizowanego)
powoduje zajęcie monitora (którego?), opuszczenie jej -
zwolnienie monitora
- Metoda synchronizowana (blok synchronizowany) może być wykonywana
na rzecz danego obiektu tylko przez wątek będący w posiadaniu
monitora tego obiektu
- Tylko jeden wątek może być w posiadaniu monitora danego
obiektu, a po jego zajęciu tylko on sam może go zwolnić
Metody wait, notify / notifyAll
- Zdefiniowane w klasie Object
- Koordynacja działania wielu wątków
- wait
- może być wywołana tylko przez wątek będący w posiadaniu
monitora
- powoduje uśpienie wątku w kolejce związanej z monitorem
(którym?)
- zwalnia monitor
- wątek może być obudzony tylko gdy inny wątek wywoła notify
(jaki to musi być wątek?)
- notify
- budzi jeden wątek spośród oczekujących w kolejce 'wait'
(której kolejce?)
- obudzony wątek oczekuje aż wątek wywołujący notify
zwolni monitor
- notifyAll działa jak notify, ale budzi
wszystkie wątki
- Działanie - synchronizacja wątków
Oczekiwanie na warunek (condition wait)
- Oczekiwanie na spełnienie określonego warunku
- Sposób na podział oczekujących zadań na grupy - zadania
z każdej grupy czekają na spełnienie innego warunku
- Zwykle realizowane przez zmienne warunkowe (condition
variables)
- Zmienne warunkowe skojarzone z monitorem to po prostu nazwane
kolejki monitora.
- Realizacja oczekiwania na warunek w Javie
Ćwiczenie
- Problem producentów i konsumentów z ograniczonym buforem - implementacja przy użyciu monitorów (5 pkt.)
- Proszę porównać działanie własnej implementacji z dostępną w klasie java.util.concurrent.ArrayBlockingQueue (3 pkt.)
- Proszę zademonstrować, że do oczekiwania na warunek konieczne jest while i notifyALL() a nie wystarczy if i notify(). (2 pkt.)
Bibliografia
- Thomas W. Christopher, George K. Thiruvathukal: High-Performance Java
Platform Computing, Prentice Hall, Luty 2001. Wybrane rozdziały.
- Bill Venners, Inside
the Java Virtual Machine (rozdz. 20, Thread Synchronization),
McGraw-Hill Companies; 2nd Bk&Cdr edition, 2000.
- Bartosz Baliś, Teoria Współbieżności, materiały własne
Maciej Malawski, malawski at agh.edu.pl
|