16.11.2013 Aufrufe

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

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

Die Metho<strong>de</strong> getZaehler() kann aus folgen<strong>de</strong>n Grün<strong>de</strong>n e<strong>in</strong> fehlerhaftes Ergebnis haben:<br />

- getZaehler() kann ausgeführt wer<strong>de</strong>n, während irgen<strong>de</strong><strong>in</strong>e an<strong>de</strong>re auch synchronisierte<br />

Metho<strong>de</strong> (z.B. <strong>in</strong>krementieren()) aus e<strong>in</strong>er Subklasse heraus ausgeführt wird. Diese an<strong>de</strong>re<br />

Metho<strong>de</strong> könnte zaehler zwischenzeitlich auf –1 setzen und erst am En<strong>de</strong> e<strong>in</strong>en korrekten Wert<br />

zuweisen. Die Metho<strong>de</strong> getZaehler() könnte zwischenzeitlich <strong>de</strong>n uns<strong>in</strong>nigen Wert –1 liefern.<br />

- Auch wenn ke<strong>in</strong>er <strong>de</strong>n Wert zwischenzeitlich auf –1 setzt, kann getZaehler() e<strong>in</strong>en falschen Wert<br />

liefern. <strong>Java</strong> garantiert, dass alle Operationen auf primitiven Typen atomar ausgeführt wer<strong>de</strong>n,<br />

außer für double und long. Das be<strong>de</strong>utet: Die Ausführung von ++zaehler könnte <strong>in</strong> zwei<br />

Schritten ablaufen. Zwischen <strong>de</strong>n bei<strong>de</strong>n Schritten könnte e<strong>in</strong> Schrittwechsel auftreten. Der Wert<br />

von zaehler nach <strong>de</strong>m 1. Schritt ist nicht spezifiziert.<br />

Aus diesen Grün<strong>de</strong>n muß getZaehler() synchronisiert wer<strong>de</strong>n:<br />

static synchronized long getZaehler()<br />

{<br />

return zaehler;<br />

}<br />

Synchronisierte Metho<strong>de</strong>n und Vererbung. Die Synchronisation gehört <strong>in</strong> <strong>Java</strong> nur<br />

zur Implementierung und wird nicht vererbt. Daher kann auch e<strong>in</strong>e Interface-<br />

Def<strong>in</strong>ition nicht das Schlüsselwort synchronized enthalten.<br />

Synchronisation statischer Metho<strong>de</strong>n. In <strong>Java</strong> gehört zu je<strong>de</strong>r Klasse e<strong>in</strong>e, vom<br />

System erzeugte Instanz <strong>de</strong>r Klasse java.lang.Class. Diese Instanz beschreibt<br />

<strong>de</strong>n Aufbau <strong>de</strong>r Klasse und macht dies zur Laufzeit verfügbar. Der Klassenname<br />

gefogt von ".class" liefert die Instanz. Wenn e<strong>in</strong>e statische Metho<strong>de</strong> als<br />

synchronized gekennzeichnet ist, entspricht dies e<strong>in</strong>er Synchronisierung mit <strong>de</strong>r<br />

zu dieser Instanz gehören<strong>de</strong>n Instanz <strong>de</strong>r Klasse java.lang.Class 120 .<br />

Bsp.:<br />

public class Zaehler<br />

{<br />

private static long maximum = 1000;<br />

public static synchronized long getMaximum()<br />

{<br />

return maximum;<br />

}<br />

…<br />

}<br />

Die Metho<strong>de</strong> getMaximum() entspricht folgen<strong>de</strong>r Implementierung:<br />

public static long getMaximum()<br />

{<br />

synchronized(Zaehler.class)<br />

{<br />

return maximum;<br />

}<br />

}<br />

Bewachte kritische Bereiche. Bisher konnte e<strong>in</strong> Thread nur auf e<strong>in</strong>e e<strong>in</strong>zige<br />

Bed<strong>in</strong>gung warten und zwar darauf, ob e<strong>in</strong> Zugriff zur Verfügung steht o<strong>de</strong>r nicht.<br />

Manchmal möchte man komplexere zustandabhängige Bed<strong>in</strong>gungen formulieren, auf<br />

<strong>de</strong>ren Erfüllung man wartet. Das könnte man so beschreiben: await E then S<br />

endwait, wobei E e<strong>in</strong> boolscher Ausdruck (Wächter) und S e<strong>in</strong>e Menge von<br />

120 vgl. 1.4.2.2<br />

109

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!