Acquire WriteLock direkt nach (oder sogar während) ReadLock

Cymatoxa

Mitglied
Servus zusammen,

ich versuche eine Möglichkeit zu finden, einen WriteLock zu bekommen, nachdem der ReadLock gelöst wurde, ohne dass ein andere Thread die Möglichkeit hat, dazwischen Schreibzugriffe zu tätigen.

Konkret: Zum Sortieren eines großen Arrays soll dieses aus performance-Gründen kopiert werden, damit das Original während des Sortiervorgangs weiter gelesen werden kann (CopyOnWrite). Das Kopieren und Sortieren bekommt also einen ReadLock, es darf währenddessen ja nicht modifiziert werden. Wenn ich jetzt das Original durch die sortierte Kopie ersetzten will, benötige ich den WriteLock. Wie kann ich jetzt sicherstellen, dass zwischen dem Lösen des ReadLocks und setzten des WriteLocks kein andere WriteLock zuvorkommt? (War das verständlich? Wenn dazwischen eine Änderung am Array vorgenommen wird, würde diese ja sonst verworfen werden...) Danke schon einmal für eure Hilfe ;)

Ich wünsche ein schönes Restwochenende und einen angenehmen Wochenstart. Schöne Grüße,

Cymatoxa
 
Hi

es ist schon klar, was du willst, aber abhängig von der Lockimplementierung ist das eventuell nicht möglich.
Was verwendest du denn? Wäre ein Umstieg auf etwas Anderes als Lock (ggf. aus einer externen Lib) denkbar?
 
Hi,

sorry, ganz verplant. Bennutze den den standard approach mit dem java.util.concurrent.locks.ReentrantReadWriteLock. Also
Code:
lock.readLock().lock();
try {
   // code
} finally {
   lock.readLock().unlock();
}
Genauso mit dem writeLock. So etwas würde wohl zu einem Deadlock führen und ist damit ausgeschlossen:

Code:
lock.readLock().lock();
try {
  // copy array
  // sort array
  lock.writeLock().lock();   // <-- Deadlock
} finally {
  lock.readLock().unlock();
}
try {
  // replace array
} finally {
  lock.readLock().unlock()
}

Schöne Grüße

Edit: Brainderp ^^ Jetzt stimmt's und ist formatiert
 
Zuletzt bearbeitet:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html hat gesagt.:
Additionally, a writer can acquire the read lock, but not vice-versa. Among other applications, reentrancy can be useful when write locks are held during calls or callbacks to methods that perform reads under read locks. If a reader tries to acquire the write lock it will never succeed.
Geht also mit den Klassen nicht.

Apache hatte sowas, wenn ich mich richtig erinnere, muss aber suchen...
sonst könnte man es auch selbst implementieren, aufbauend auf den bestehenden Klassen,
ist dann aber klarerweise etwas langsamer und speicherhungriger als die Grundklasse selber.
 
Da ich großen Wert auf Performanz lege... verdammt! :D
Vielen Dank für deine Antwort jedenfalls. Mal sehen, was ich für Alternativen finde.

Schöne Grüße,

Cymatoxa
 

Neue Beiträge

Zurück