package raceConditions; import static raceConditions.TimesTwo.print; /** * In dieser Klasse wurden zur besseren Visualisierung einige Ausgaben über eine * Methode print (ganz unten definiert) vorgenommen. Außerdem wurde das * "synchronized" aus dem Methodenheader in einen synchronized(this) Block * gepackt werden - das macht keinen Unterschied und ist exakt dasselbe, dient * nur der Visualisierung. Normalerweise arbeitet man mit synchronized-Blöcken, * da man dann ein Objekt für das intrinsische Lock angeben kann, während in * einer als synchronized deklarierten Methoden immer this "genommen" wird. * Kommentare zum intrinsischen Lock findest du in write(). * * @author Stefan Berktold */ public class SyncNumber { private int c = 1; public int read() { print("n.read:Enter"); // Methode wurde aufgerufen print("n.lock:Enter"); synchronized (this) { print("n.lock:Return"); // hier eigentlich return, dann die Ausgaben print("n.unlock()"); print("n.read:Return"); // eigentlich "nach" return return c; } } public void write(int c) { print("n.write:Enter"); print("n.lock:Enter"); // will Lock haben synchronized (this) { // entspricht synchronized in Methodenheader print("n.lock:Return"); // habe Lock this.c = c; print("n.unlock()"); // gebe Lock ab } print("n.write:Return"); } }