Teoria współbieżności

Informatyka


Laboratorium 2 - monitory w Javie

Monitory w javie

  1. Związane z każdym obiektem
  2. Same nie są reprezentowane jako klasy / obiekty!
  3. Synchronizują dostęp do metod i bloków synchronized
  4. Dodatkowy monitor związany z klasą - dla metod statycznych synchronizowanych

Synchronizacja

  1. Metody synchronized
  2. 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();
        ...
    }
    
  3. 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

  1. Zdefiniowane w klasie Object
  2. Koordynacja działania wielu wątków
  3. 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?)
  4. 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

  5. Działanie - synchronizacja wątków

Oczekiwanie na warunek (condition wait)

  1. Oczekiwanie na spełnienie określonego warunku

  2. Sposób na podział oczekujących zadań na grupy - zadania z każdej grupy czekają na spełnienie innego warunku

  3. Zwykle realizowane przez zmienne warunkowe (condition variables)
    • wait(C)
    • signal(C)

  4. Zmienne warunkowe skojarzone z monitorem to po prostu nazwane kolejki monitora.

  5. Realizacja oczekiwania na warunek w Javie
    • Nie ma zmiennych warunkowych - jest tylko jedna anonimowa kolejka wait
    • Oczekiwanie w pętli while
      while (! warunek) {
        wait();
      }
      
    • Inny proces zmienia wartość zmiennej 'warunek' i wykonuje notifyAll

Ćwiczenie

  1. Problem producentów i konsumentów z ograniczonym buforem - implementacja przy użyciu monitorów (5 pkt.)
  2. Proszę porównać działanie własnej implementacji z dostępną w klasie java.util.concurrent.ArrayBlockingQueue (3 pkt.)
  3. Proszę zademonstrować, że do oczekiwania na warunek konieczne jest while i notifyALL() a nie wystarczy if i notify(). (2 pkt.)

Bibliografia

  1. Thomas W. Christopher, George K. Thiruvathukal: High-Performance Java Platform Computing, Prentice Hall, Luty 2001. Wybrane rozdziały.
  2. Bill Venners, Inside the Java Virtual Machine (rozdz. 20, Thread Synchronization), McGraw-Hill Companies; 2nd Bk&Cdr edition, 2000.
  3. Bartosz Baliś, Teoria Współbieżności, materiały własne


Maciej Malawski, malawski at agh.edu.pl