Monitor w Javie

Monitor to mechanizm synchronizacji wykorzystywany do zarządzania dostępem do zasobów współdzielonych przez wiele wątków. Pozwala na uzyskanie ekskluzywnego (tylko jeden wątek w danym momencie) dostępu do zasobów.

W praktyce wygląda to tak, że gdy jeden wątek jest w trakcie wykonywania metody lub bloku synchronizowanego (jeśli blok jest oparty o synchronized(this)) w klasie A, to w tym samym momencie żaden inny wątek nie może rozpocząć wykonywania tej samej metody lub bloku, ale także innych metod czy bloków synchronizowanych przynależących do tego samego obiektu.

Przykład

Załóżmy prostą klasę:

class MonitorExample{
    public synchronized void doSth(){ ... }
    public synchronized void doSthElse(){ ... }
    public void doSthInSynchronizedBlock(){
        synchronized(this){
            ...
        }
    }
}

Jeśli jeden wątek już znajdzie się w miejscu synchronizowanym (w przykładzie powyżej, są to miejsca gdzie znajdują się trzy kropki), to żaden inny wątek nie będzie mógł wykonywać innego miejsca synchronizowanego, dopóki ten pierwszy nie skończy wykonywania całej metody/bloku. Przykład działającego kodu znajdziesz tutaj.

Warto zajrzeć

  1. https://www.baeldung.com/cs/monitor
  2. https://github.com/damianradowiecki/monitor-example