Moin,
ich habe das folgende Problem mit Locks:
Ich habe mehrere Methoden und wenn ein kritischer Abschnitt in Methode a() erreicht wird, dann muss auch gleichzeitig ein kritischer Abschnitt in Methode b() "scharf gestellt" werden.
Umgekehrt gilt dies aber nicht!
Ich probiere es am Beispiel deutlich zu machen:
Wenn die set Methode aufgerufen wird, dürfen andere Threads auch nicht auf die get-Methode zugreifen. Wenn aber kein Thread in der set-Methode ist, sollen sie alle parallel auf die get zugreifen.
Meine nicht korrekte Lösung nutzt ein ReentrantLock-Objekt, das in set aktiviert wird und in get mit isLocked() abgefragt wird:
Mit dieser "Lösung" kann das Problem auftreten, dass Thread 1 im passiv-kritischen Bereich ist, wenn Thread2 den aktiv-kritischen Bereich locked, da Thread1 nur vor dem passiv kritischen Bereich testet, ob der Lock gesetzt ist, er müsste es aber während des ganzen Abschnitts tun und jeder andere Thread müsste mit dem Betreten des aktiv-kritischen Abschnitts warten, bis alle Threads aus dem passiv-kritischen raus sind.
Wie löst man das am saubersten?
ich habe das folgende Problem mit Locks:
Ich habe mehrere Methoden und wenn ein kritischer Abschnitt in Methode a() erreicht wird, dann muss auch gleichzeitig ein kritischer Abschnitt in Methode b() "scharf gestellt" werden.
Umgekehrt gilt dies aber nicht!
Ich probiere es am Beispiel deutlich zu machen:
Java:
private static volatile char[] accectableChars;
public char[] getAccectableChars()
{
// start passiv-kritischer Bereich
...
// end passiv-kritischer Bereich
return accectableChars;
}
public void setAccectableChars(char[] accectableChars)
{
// start aktiv-kritischer Bereich
accectableChars = accectableChars;
// end aktiv-kritischer Bereich
}
Meine nicht korrekte Lösung nutzt ein ReentrantLock-Objekt, das in set aktiviert wird und in get mit isLocked() abgefragt wird:
Java:
private final ReentrantLock setCharLock;
private static volatile char[] accectableChars;
public char[] getAccectableChars()
{
while(setCharLock.isLocked())
{
}
// start passiv-kritischer Bereich
...
// end passiv-kritischer Bereich
return accectableChars;
}
public void setAccectableChars(char[] accectableChars)
{
// start aktiv-kritischer Bereich
setCharLock.lock();
accectableChars = accectableChars;
// end aktiv-kritischer Bereich
setCharLock.unlock();
}
Wie löst man das am saubersten?