summaryrefslogtreecommitdiff
path: root/ws2015/oss/blaetter/12/Speicher.java
diff options
context:
space:
mode:
Diffstat (limited to 'ws2015/oss/blaetter/12/Speicher.java')
-rw-r--r--ws2015/oss/blaetter/12/Speicher.java75
1 files changed, 75 insertions, 0 deletions
diff --git a/ws2015/oss/blaetter/12/Speicher.java b/ws2015/oss/blaetter/12/Speicher.java
new file mode 100644
index 0000000..b521466
--- /dev/null
+++ b/ws2015/oss/blaetter/12/Speicher.java
@@ -0,0 +1,75 @@
1public class Speicher {
2 private int anzahl_schreibewuensche; // Alter variablenname 'anzahl_der_schreibewunsche' war inkonsistent mit den anderen
3 private int anzahl_leser;
4 private boolean schreiber_aktiv;
5 private String daten;
6
7 public Speicher (String initial) {
8 anzahl_schreibewuensche = 0;
9 anzahl_leser = 0;
10 schreiber_aktiv = false;
11 daten = initial;
12 }
13
14 public synchronized void leserecht_holen(int prozess_id) { // Alte methodennamen 'leserechte_holen' und 'leserechte_freigeben' waren inkonsistent
15 while ( schreiber_aktiv || anzahl_schreibewuensche > 0) { // Blocken bis kein Prozess schreibrecht hat oder will
16 try {
17 this.wait();
18 } catch (InterruptedException ie) {}
19 }
20
21 anzahl_leser++;
22
23 System.out.println("Prozess " + prozess_id
24 + " ==> Leserecht erhalten (" + anzahl_leser + " Leser)");
25 }
26
27 public synchronized void leserecht_freigeben(int prozess_id) {
28 anzahl_leser--;
29 System.out.println("Prozess " + prozess_id
30 + " ==> Leserecht freigegeben (" + anzahl_leser + " Leser)");
31 this.notifyAll(); // Alle blockenden Prozesse aufwecken (nacheinander)
32 }
33
34 public synchronized void schreibrecht_holen(int prozess_id) {
35 anzahl_schreibewuensche++;
36
37 while (schreiber_aktiv || anzahl_leser > 0) { // Blocken bis alle leser/schreiber fertig
38 try {
39 this.wait();
40 } catch (InterruptedException ie) {}
41 }
42
43 // Anfang kritischer Bereich
44
45 schreiber_aktiv = true;
46 anzahl_schreibewuensche--;
47
48 // Ende kritischer Bereich
49
50 System.out.println("Prozess " + prozess_id
51 + " ==> Schreibrecht erhalten (" + anzahl_leser + " Leser)");
52 }
53
54 public synchronized void schreibrecht_freigeben(int prozess_id) {
55 schreiber_aktiv = false;
56 System.out.println("Prozess " + prozess_id
57 + " ==> Schreibrecht freigegeben (" + anzahl_leser + " Leser)");
58 this.notifyAll();
59 }
60
61 public String lese() {
62 try { // Das Lesen dauert etwas...
63 Thread.sleep(400);
64 } catch (InterruptedException e) {}
65 return daten;
66 }
67
68 public synchronized void schreibe(String s) {
69 try { // Das Schreiben dauert etwas...
70 Thread.sleep(400);
71 } catch (InterruptedException e) {}
72 this.daten = s;
73 }
74
75}