Das Java Concurrency Framework bietet Abstraktionen, die das Erzeuger-Verbraucher-Problem im Vergleich zu den traditionellen synchronisierten Monitoren mit wait und notify effizienter lösen.
Insbesondere können Bedingungen durch die Klasse Condition feingranularer eingestellt werden.
Wichtige Methoden
Lock
= Monitor
Konstruktor: new ReentrantLock()
Lock.lock()- Sperre den MonitorLock.unlock()- Löse die SperreLock.newCondition()- Erstelle eine neueCondition
ReadWriteLock
Konstruktor: new ReentrantReadWriteLock()
Spezialfall des Locks, das ein
ReadLockund einWriteLockbereitstellt
ReadWriteLock.readLock()- Gibt dasReadLockzurückReadWriteLock.writeLock()- Gibt dasWriteLockzurück
Condition
Condition.await()Condition.signal()Condition.signalAll()
Implementierung
public class Stapelspeicher {
Stack<Object> stapel = new Stack<>();
Lock monitor = new ReentrantLock();
Condition leser = monitor.newCondition();
Condition schreiber = monitor.newCondition();
public Object get() {
monitor.lock();
try {
while( stapel.empty() ) {
try {
leser.await();
} catch (InterruptedException e) {
//
}
}
Object o = stapel.pop();
schreiber.signal();
return o;
} finally {
// In Java wird der finally-block immer ausgeführt.
// Der Monitor wird hier also unlocked, bevor oben das return
// ausgeführt wird.
monitor.unlock();
}
}
}