public class Speicher { private int anzahl_schreibewuensche; // Alter variablenname 'anzahl_der_schreibewunsche' war inkonsistent mit den anderen private int anzahl_leser; private boolean schreiber_aktiv; private String daten; public Speicher (String initial) { anzahl_schreibewuensche = 0; anzahl_leser = 0; schreiber_aktiv = false; daten = initial; } public synchronized void leserecht_holen(int prozess_id) { // Alte methodennamen 'leserechte_holen' und 'leserechte_freigeben' waren inkonsistent while ( schreiber_aktiv || anzahl_schreibewuensche > 0) { // Blocken bis kein Prozess schreibrecht hat oder will try { this.wait(); } catch (InterruptedException ie) {} } anzahl_leser++; System.out.println("Prozess " + prozess_id + " ==> Leserecht erhalten (" + anzahl_leser + " Leser)"); } public synchronized void leserecht_freigeben(int prozess_id) { anzahl_leser--; System.out.println("Prozess " + prozess_id + " ==> Leserecht freigegeben (" + anzahl_leser + " Leser)"); this.notifyAll(); // Alle blockenden Prozesse aufwecken (nacheinander) } public synchronized void schreibrecht_holen(int prozess_id) { anzahl_schreibewuensche++; while (schreiber_aktiv || anzahl_leser > 0) { // Blocken bis alle leser/schreiber fertig try { this.wait(); } catch (InterruptedException ie) {} } // Anfang kritischer Bereich schreiber_aktiv = true; anzahl_schreibewuensche--; // Ende kritischer Bereich System.out.println("Prozess " + prozess_id + " ==> Schreibrecht erhalten (" + anzahl_leser + " Leser)"); } public synchronized void schreibrecht_freigeben(int prozess_id) { schreiber_aktiv = false; System.out.println("Prozess " + prozess_id + " ==> Schreibrecht freigegeben (" + anzahl_leser + " Leser)"); this.notifyAll(); } public String lese() { try { // Das Lesen dauert etwas... Thread.sleep(400); } catch (InterruptedException e) {} return daten; } public synchronized void schreibe(String s) { try { // Das Schreiben dauert etwas... Thread.sleep(400); } catch (InterruptedException e) {} this.daten = s; } }