16.11.2013 Aufrufe

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Programmieren</strong> <strong>in</strong> <strong>Java</strong><br />

aktuellen Zeit durchlaufen wer<strong>de</strong>n darf) mit Hilfe e<strong>in</strong>er automatisch gesetzten Sperre.<br />

Die Sperre wird beim E<strong>in</strong>tritt <strong>in</strong> <strong>de</strong>n Monitor gesetzt und beim Verlassen wie<strong>de</strong>r<br />

zurückgenommen. Ist sie beim E<strong>in</strong>tritt <strong>in</strong> <strong>de</strong>n Monitor bereits von e<strong>in</strong>em an<strong>de</strong>ren<br />

Prozeß gesetzt, dann muß <strong>de</strong>r aktuelle Prozeß warten, bis <strong>de</strong>r Konkurent die Sperre<br />

freigegeben und <strong>de</strong>n Monitor verlassen hat.<br />

Das Monitor-Konzept wird mit Hilfe <strong>de</strong>s Schlüsselworts synchronized realisiert.<br />

Durch synchronized kann entwe<strong>de</strong>r e<strong>in</strong>e komplette Metho<strong>de</strong> o<strong>de</strong>r e<strong>in</strong> Block<br />

<strong>in</strong>nerhalb e<strong>in</strong>er Metho<strong>de</strong> geschützt wer<strong>de</strong>n. Der E<strong>in</strong>tritt <strong>in</strong> <strong>de</strong>n so <strong>de</strong>klarierten Monitor<br />

wird als Sperre <strong>de</strong>r this-Po<strong>in</strong>ter verwen<strong>de</strong>t, an<strong>de</strong>renfalls ist die Objektvariable<br />

explizit anzugeben.<br />

Neben <strong>de</strong>m Monitorkonzept stehen mit <strong>de</strong>n Metho<strong>de</strong>n wait() und notify() <strong>de</strong>r<br />

Klasse Object noch weitere Synchronisationsprimitive zur Verfügung. Zusätzlich zu<br />

<strong>de</strong>r bereits erwähnten Sperre, die e<strong>in</strong>em Objekt zugeordnet ist, besitzt e<strong>in</strong> Objekt<br />

e<strong>in</strong>e Warteliste. Dabei han<strong>de</strong>lt es sich um e<strong>in</strong>e (möglicherweise leere) Menge von<br />

Threads, die von e<strong>in</strong>em Scheduler unterbrochen wur<strong>de</strong>n und auf Ereignisse warten,<br />

um fortgesetzt wer<strong>de</strong>n zu können.<br />

wait() und notify() dürfen nur aufgerufen wer<strong>de</strong>n, wenn das Objekt bereits<br />

gesperrt ist, also nur <strong>in</strong>nerhalb e<strong>in</strong>es synchronized-Blocks. E<strong>in</strong> Aufruf von wait()<br />

nimmt die bereits gewährten Sperren (temporär) zurück und stellt <strong>de</strong>m Prozeß, <strong>de</strong>r<br />

<strong>de</strong>n Aufruf von wait() verursachte, <strong>in</strong> die Warteliste <strong>de</strong>s Objekts. Dadurch wird er<br />

unterbrochen. E<strong>in</strong> Aufruf von notify() entfernt e<strong>in</strong>en (beliebigen) Prozeß aus <strong>de</strong>r<br />

Warteliste <strong>de</strong>s Objekts, stellt die (temporär) aufgehobenen Sperren wie<strong>de</strong>r her und<br />

führt ihn <strong>de</strong>m normalen Schedul<strong>in</strong>g zu. „wait()“ und „notify()“ s<strong>in</strong>d damit für<br />

elementare Synchronisationsaufgaben geeignet, bei <strong>de</strong>nen es weniger auf die<br />

Kommunikation als auf die Steuerung zeitlicher Abläufe ankommt . Zusätzlich bietet<br />

die Klasse Object auch noch die Metho<strong>de</strong> notifyAll(). Der Unterschied zu<br />

notify() ist, dass alle warten<strong>de</strong>n Threads „aufgeweckt“ (reaktiviert wer<strong>de</strong>n, bei<br />

notify() nur e<strong>in</strong> e<strong>in</strong>ziger.<br />

Threadkommunikation<br />

Verschie<strong>de</strong>ne Threads können auf verschie<strong>de</strong>nen Wegen effizient Daten<br />

austauschen: Streams, geme<strong>in</strong>sam genutzte Objekte, statische Variablen. Die<br />

bei<strong>de</strong>n zuletzt angegebenen Alternativen basieren darauf, dass verschie<strong>de</strong>n Threads<br />

e<strong>in</strong>en geme<strong>in</strong>samen Adressraum (Heap) teilen. Somit können mehrere Thread-<br />

Objekte diesselben Objekte im Speicher ansprechen.<br />

111

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!