Hallo,
ich habe hier eine Aufgabe, die ich nicht wirklich gelöst bekomme.
Wir haben einen wie folgt gegebenen einelementigen Puffer, der auf zwei Objekten synchronisiert ist:
Nun soll eine Methode swap() hinzugefügt werden, die den Wert des Buffers mit einem anderen Wert tauscht. Falls der Buffer gerade leer ist, soll sie suspendieren.
Meine Überlegung war folgende:
Nun kann es doch aber zu deadlocks kommen.. muss ich ein drittes Lock einführen, um das Problem zu lösen?
Oder sollte ich die ganze Methode swap() auf synchronized sezten?
ich habe hier eine Aufgabe, die ich nicht wirklich gelöst bekomme.
Wir haben einen wie folgt gegebenen einelementigen Puffer, der auf zwei Objekten synchronisiert ist:
Java:
public class Buffer1<T> {
private T content;
private boolean empty;
private Object r = new Object();
private Object w = new Object();
public Buffer1() {
empty = true;
}
public Buffer1(T content) {
this.content = content;
empty = false;
}
public T take() throws InterruptedException {
synchronized (r) {
while (empty) {
r.wait();
}
synchronized (w) {
empty = true;
w.notify();
return content;
}
}
}
public void put(T o) throws InterruptedException {
synchronized(w) {
while (!empty) {
w.wait();
}
synchronized (r) {
empty = false;
r.notify();
content = o;
}
}
}
public boolean isEmpty() {
return empty;
}
}
Nun soll eine Methode swap() hinzugefügt werden, die den Wert des Buffers mit einem anderen Wert tauscht. Falls der Buffer gerade leer ist, soll sie suspendieren.
Meine Überlegung war folgende:
Java:
public void swap(T o) throws InterruptedException {
synchronized(w) {
while (empty) {
w.wait();
}
synchronized (r) {
T buf = o;
o = content;
r.notify();
content = buf;
}
}
}
Nun kann es doch aber zu deadlocks kommen.. muss ich ein drittes Lock einführen, um das Problem zu lösen?
Oder sollte ich die ganze Methode swap() auf synchronized sezten?
Zuletzt bearbeitet: