12.01.2014 Aufrufe

2-up - ETH Zürich

2-up - ETH Zürich

2-up - ETH Zürich

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.

Wirkung von „synchronized“<br />

• Alle bezüglich des gleichen Sperrobjektes synchronisierten<br />

kritischen Abschnitte schliessen sich wechselseitig aus<br />

• Wird automatisch durch die Java-VM garantiert<br />

• Beispiel:<br />

synchronized (Konto) {<br />

float a = Konto.Stand();<br />

a = a + Betrag;<br />

Konto.Update(a);<br />

}<br />

Man versuche herauszufinden,<br />

was die Java-<br />

Sprachbeschreibung<br />

zur Fairness aussagt<br />

• Beachte: unkooperative Threads können aber weiterhin z.B.<br />

über die Objektreferenz (hier: „Konto“) auf das „gesperrte“<br />

Objekt zugreifen und es „parallel“ manipulieren<br />

• Die richtige Verwendung des Sperrmechanismus<br />

liegt in der Verantwortung des Programmierers!<br />

821<br />

Beispiel für „synchronized“<br />

Initial: int a = 1, b = 2;<br />

Thread 1: a = b;<br />

Thread 2: b = a;<br />

• Zuweisung ist nicht atomar!<br />

1. Lesen aus dem Ha<strong>up</strong>tspeicher in<br />

In the absence of explicit synchronization,<br />

a Java implementation is free<br />

to <strong>up</strong>date the main memory in an<br />

order that may be surprising. Therefore<br />

the programmer who prefers to<br />

avoid surprises should use explicit<br />

synchronization.<br />

(Java Language Specification)<br />

den Arbeitsbereich des Thread (u.a. Stack, CPU-Register...)<br />

2. Schreiben aus dem Arbeitsbereich in den Ha<strong>up</strong>tspeicher<br />

• Daher sind drei Ergebnisse möglich:<br />

• a = 2, b = 2 (Thread 1 ganz vor Thread 2)<br />

• a = 1, b = 1 (Thread 2 ganz vor Thread 1)<br />

• a = 2, b = 1 (vertauschte Werte durch Interleaving!)<br />

iload_1<br />

istore_0<br />

iload_0<br />

istore_1<br />

822<br />

340

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!