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 />

Offensichtlich ist es notwendig, bei<strong>de</strong> Threads zu koord<strong>in</strong>ieren. Sie müssen so<br />

synchronisiert wer<strong>de</strong>n, dass nur e<strong>in</strong> Thread das Prüfen <strong>de</strong>r Bed<strong>in</strong>gung und das<br />

Inkrementieren atomar, d.h. vollständig ohne Unterbrechung ausführt.<br />

H<strong>in</strong>weis. Wie immer bei fehlen<strong>de</strong>r Synchronisation muß <strong>de</strong>r im Beispiel gezeigte<br />

Fehler nicht zw<strong>in</strong>gend auftreten und kann lange Zeit völlig unbemerkt bleiben. Je<br />

nach<strong>de</strong>m, wann die Threads aktiv s<strong>in</strong>d bzw. bei e<strong>in</strong>em Prozessor sich abwechseln,<br />

ergeben sich unterschiedliche Resultate 118 .<br />

Synchronisation paralleler Prozesse <strong>in</strong> <strong>Java</strong>. Mehrere Threads können nur über<br />

geme<strong>in</strong>same Variable kommunizieren. Folgen<strong>de</strong> Konflikte können dabei auftreten:<br />

- Gleichzeitiges Lesen und Schreiben<br />

E<strong>in</strong> Thread liest und e<strong>in</strong> an<strong>de</strong>rer än<strong>de</strong>rt gera<strong>de</strong> das Objekt, ist aber noch nicht fertig.<br />

- Gleichzeitiges Schreiben<br />

Mehrere Threads versuchen das Objekt gleichzeitig zu än<strong>de</strong>rn.<br />

Rufen mehrere Threads Metho<strong>de</strong>n gleichzeitig auf, dann kann ohne Synchronisation<br />

e<strong>in</strong> Zwischenzustand e<strong>in</strong>er Metho<strong>de</strong> <strong>de</strong>n Ablauf e<strong>in</strong>er an<strong>de</strong>ren Metho<strong>de</strong><br />

bee<strong>in</strong>flussen. Zur Vermeidung von Konflikten gibt es mehrere Möglichkeiten:<br />

- Schreiben nicht zulassen<br />

E<strong>in</strong>e Klasse wird so <strong>de</strong>f<strong>in</strong>iert, dass e<strong>in</strong>e Än<strong>de</strong>rung <strong>de</strong>r Attribute nach <strong>de</strong>m Erzeugen von Objekten<br />

nicht mehr möglich ist (immutable class). Bei <strong>Java</strong> können bspw. mehrere Threads problemlos<br />

auf e<strong>in</strong> gleiches Objekt <strong>de</strong>r Klasse java.lang.Str<strong>in</strong>g zugreifen, da e<strong>in</strong> Str<strong>in</strong>g nicht mehr<br />

geän<strong>de</strong>rt wer<strong>de</strong>n kann. Je<strong>de</strong> Metho<strong>de</strong> <strong>de</strong>r Klasse produziert bei e<strong>in</strong>er Än<strong>de</strong>rung <strong>de</strong>s Werts e<strong>in</strong><br />

neues Str<strong>in</strong>g Objekt. 119<br />

- Lesen und Schreiben synchronisieren<br />

Für e<strong>in</strong>en Bereich, <strong>in</strong> <strong>de</strong>n geme<strong>in</strong>same Variable geschrieben o<strong>de</strong>r gelesen wer<strong>de</strong>n, benötigt je<strong>de</strong>r<br />

Thread e<strong>in</strong>e Sperre bevor er diesen Bereich ausführt. Danach gibt er die Sperre wie<strong>de</strong>r frei. Mit<br />

diesem gegenseitigen Ausschluß (mutually exclusive lock) lassen sich Zugriffe auf Objekte so<br />

koord<strong>in</strong>ieren, dass Konflikte vermie<strong>de</strong>n wer<strong>de</strong>n.<br />

In <strong>Java</strong> müssen alle Bereiche, <strong>in</strong> <strong>de</strong>m geme<strong>in</strong>same Variable geschrieben o<strong>de</strong>r<br />

gelesen wer<strong>de</strong>n, explizit mit <strong>de</strong>m Schlüsselwort synchronized zur Vermeidung von<br />

Konflikten versehen wer<strong>de</strong>n.<br />

synchronized(O)<br />

{<br />

S<br />

}<br />

O ist e<strong>in</strong> beliebiger Ausdruck, <strong>de</strong>r e<strong>in</strong> <strong>Java</strong>-Objekt liefert, und S e<strong>in</strong>e Menge von Anweisungen.<br />

Erreicht e<strong>in</strong> Thread die synchronized Anweisung, dann gelten folgen<strong>de</strong> Regeln:<br />

- Der Thread versucht exklusiven Zugriff auf das Objekt O zu erhalten.<br />

- Wenn ke<strong>in</strong> an<strong>de</strong>rer Thread <strong>de</strong>n exklusiven Zugriff auf das Objekt hat, gel<strong>in</strong>g dies.<br />

- Besitzt e<strong>in</strong> an<strong>de</strong>rer Thread <strong>de</strong>n exklusiven Zugriff auf das Objekt, dann wartet <strong>de</strong>r Thread, bis das<br />

Objekt O wie<strong>de</strong>r freigegeben wird. Es können mehrere Threads auf die Freigabe warten.<br />

- Erhält e<strong>in</strong> Thread <strong>de</strong>n exklusiven Zugriff auf O, dann tritt er <strong>in</strong> <strong>de</strong>n Anweisungsblock e<strong>in</strong>.<br />

- Verläßt <strong>de</strong>r Thread <strong>de</strong>n Anweisungsblock, <strong>in</strong> <strong>de</strong>m er <strong>de</strong>n exklusiven Zugriff erhalten hat, dann gibt er<br />

das Objekt wie<strong>de</strong>r frei.<br />

118 Dies macht es extrem schwierig <strong>in</strong> e<strong>in</strong>em fertigen System fehlerhafte Co<strong>de</strong>-Stellen zu f<strong>in</strong><strong>de</strong>n. Vor allem kann<br />

alle<strong>in</strong> das Suchen <strong>de</strong>s Fehlers mit Hilfe vom Debugger <strong>de</strong>n Fehler verschw<strong>in</strong><strong>de</strong>n lassen. Durch das Beobachten<br />

mit <strong>de</strong>m Debugger wird das Abwechseln von Threads bee<strong>in</strong>flusst.<br />

119 Für e<strong>in</strong>e performante Än<strong>de</strong>rung e<strong>in</strong>es Str<strong>in</strong>g steht die Klasse java.lang.Str<strong>in</strong>gBuffer zur<br />

Verfügung, diese ist aber nicht sicher für die gleichzeitige Verwendung durch mehrere Threads (thread safe).<br />

107

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!