Monitor (programowanie)

Monitor jest podejście do synchronizowania dwóch lub więcej zadań , że wykorzystanie udostępnionych zasobów, zwykle oddzielnych urządzeń (drukarki) lub zestawów zmiennych.

W przeszłości systemy operacyjne były zredukowane do prostego programu monitorującego, łączącego w łańcuch wykonywanie innych (na przykład DOS IBM 360 pod koniec lat sześćdziesiątych). To znaczenie jest dziś niezwykłe i nie ma nic wspólnego z obecnym znaczeniem (synchronizacja).

Wzajemne wykluczenie

Monitor składa się z:

Przykłady wykorzystania monitorów w Javie

Rozważ dwa wątki, które chcą się ze sobą komunikować. Pierwszy wątek wysyła komunikaty do drugiego wątku za pośrednictwem kolejki . Jeśli kolejka jest pusta, drugi wątek musi czekać na nową wiadomość. Taką kolejkę można zaimplementować za pomocą następującego kodu:

import java.util.*; public class EchangeMessage { private ArrayList l = new ArrayList(); public void enfiler(Object o) { l.add(o); if(l.size()==1) { try { this.notify(); } catch (IllegalMonitorStateException e) {} } } public Object defiler() { if(l.size()==0) { try { this.wait(); } catch (InterruptedException e){} } Object o = l.get(0); l.remove(0); return o; } public synchronized boolean vide() { return l.isEmpty(); } }
Ta klasa używa trzech metod.
  • Metoda wątku dodaje dane do kolejki i jeśli kolejka była wcześniej pusta, to zwalnia możliwe zadanie, które będzie czekać.
  • Metoda scroll odczytuje wartość z kolejki. Jeśli żadne dane nie są dostępne, zostaje wstrzymane.
  • Metoda empty pozwala wiedzieć, czy kolejka jest pusta.

W odniesieniu do tego przykładu można poczynić następujące uwagi dotyczące działania Javy:

  • Monitory Java nie mają operacji FIFO . Oznacza to, że niekoniecznie zadanie, które czeka najdłużej, zostanie obudzone jako pierwsze.
  • Monitory powinny być używane w zsynchronizowanych blokach. Blokada skojarzona z synchronizacją jest niejawnie zwracana po wstrzymaniu i automatycznie przywracana po przebudzeniu zadania.

Zobacz też