summaryrefslogtreecommitdiff
path: root/ws2015/oss/blaetter/12/Speicher.java
blob: b521466515132388955f2a5de6e3da84f4eeae23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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;
    }

}