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;
}
}
|