Weiß jemand, wie ich die lock und conditions in java hier zu programmieren habe?
Hi, ich beschäftige mich zurzeit mit lock und conditions.
public class LockedDataObject extends DataObject {
/** Anzahl aktueller Leser */
int noReaders;
/** Wahr, wenn Schreiber momentan wartend oder schreibend */
boolean writer;
/**
* Condition-Variable zum Schlafenlegen von bzw. Aufwecken des Schreibers
*/
Condition condWrite;
/** Condition-Variable zum Schlafenlegen bzw. Aufwecken der Leser */
Condition condRead;
/**
* Sperre, um alle oberen Variablen zu schützen. Bevor auf eine der
* Variablen zugeriffen wird, muss ggf. diese Sperre erworben werden. Der
* Erwerb der Sperre soll *nur dann* erfolgen, wenn es für die korrekte
* Ausführung unbedingt notwendig ist. Das ist bei einem ändernden Zugriff
* nur dann der Fall, wenn andere Threads die entsprechende Variable
* zeitgleich lesen oder schreiben können. Bei einem lesenden Zugriff soll
* die Sperre nicht erworben werden, wenn andere Threads zeitgleich nur
* lesend, aber nicht schreibend, auf die entsprechende Variable zugreifen
* können.
*/
ReentrantLock lock;
public LockedDataObject() {
this.lock = new ReentrantLock();
this.condRead = lock.newCondition();
this.condWrite = lock.newCondition();
this.noReaders = 0;
this.writer = false;
}
public int sum() {
// Beachten Sie durchgängig die korrekte Verwendung der Sperrvariable
// "lock". Erwerben Sie die Sperre nur, falls unbedingt notwendig.
// 1. Solange ein Schreiber wartet oder schreibt, schlafenlegen.
// 2. Anzahl der Leser um 1 erhöhen.
// 3. Summe bilden
int sum = super.sum();
// 4. Anzahl der Leser erniedrigen und ggf. Schreiber aufwecken.
// 5. Summe zurueckgeben
return sum;
}
public void randomSwap() {
// Beachten Sie durchgängig die korrekte Verwendung der Sperrvariable
// "lock". Erwerben Sie die Sperre nur, falls unbedingt notwendig.
// 1. Anzeigen, dass ein Schreiber wartet.
// 2. Schlafenlegen, solange noch mindestens ein Leser aktiv
// 3. Elemente vertauschen
super.randomSwap();
// 4. Anzeigen, dass kein Schreiber mehr wartet/schreibt und
// ggf. Leser aufwecken.
}
}
Diese Aufgabe haben wir als Übung erhalten, der Dozent meinte, durch die Kommentare, sei das eine 5 Minuten Aufgabe, damit können wir mal üben.
Es sei so einfach, dass keine Lösungen nötig seien..., da ja alles kommentiert sei.
Die Aufgaben stehen bei den beiden Methoden, also was genau man zu tun hat...
Wie wprde man das lösen? Könnte das jemand kurz tun, damit ich mal sehe, wie man hier vorgeht, ich lerne mehr beim sehen einer korrekten Lösung, wenn ich ein Thema neu lerne.
Ich konnte mir zu allem was denken, außer zu: " // 1. Anzeigen, dass ein Schreiber wartet." Wie soll man das zeigen?
2 Antworten
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Das ist bei einem ändernden Zugriff
* nur dann der Fall, wenn andere Threads die entsprechende Variable
* zeitgleich lesen oder schreiben können.
Naja, wie man es nimmt. Der Cache muss ja auch rausgeschrieben und aus dem Hauptspeicher gelesen werden und das tut der nicht von selbst, sondern nur, bei Anfrage bzw. Freigabe eines Locks (was von beiden genau müsste man nachschauen).
Oder man macht die betreffenden variablen "volatile".
Entsprechend kann ich dir auch keine Lösung anbieten, denn dann müsste ich öfters Locks benutzen, als es dir Aufgabenstellung fordert.
![](https://images.gutefrage.net/media/user/daCypher/1444744777_nmmslarge.jpg?v=1444744777000)
Mit "Anzeigen, dass ein Schreiber wartet" ist einfach gemeint, dass du die Variable this.writer auf true setzen sollst.
So ganz weiß ich aber nicht, wie sich dein Dozent das vorgestellt hat. Wenn du z.B. die Anzahl der Leser erhöhst oder "erniedrigst", ist das auch jeweils ein schreibender Zugriff auf eine gemeinsame Variable, den du mit einem Lock oder einem synchronized umschließen musst.
Außerdem muss man noch aufpassen, dass nicht mehrere Schreiber gleichzeitig aufgerufen werden können.
Normalerweise würde man für sowas ein ReadWriteLock benutzen, was genau dafür gedacht ist, dass mehrere Leser ein Lock erwerben können, solange kein Schreiber aktiv ist und dass immer nur ein Schreiber auf einmal ein Lock erwerben kann, solange kein Leser aktiv ist.