Ich habe eine Klasse, die zu diesem ähnlich ist:Wie wartet die Methode auf die Freigabe der Sperre?
public class ExpensiveCalculation {
private Executor threadExecutor = ...
private Object lock = new Object();
private Object data = null;
public Object getData() {
synchronized(lock) {
return data;
}
}
pulic void calculate() {
executor.execute(() -> internalCalculation());
}
private void internalCalculation() {
synchronized(lock) {
// do some long running calculation that in the end updates data
data = new Object();
}
}
}
Diese Klasse macht einige teuer (zeitlich) Berechnungen und erwirbt eine Sperre. Während die Sperre gehalten wird, kann niemand die Daten abrufen, die durch die Berechnung aktualisiert werden, so dass sie tatsächlich warten müssen, bis die Berechnung beendet ist. Die eigentliche Berechnung erfolgt in einem separaten Thread. Wenn ich den folgenden Code:
ExpensiveCalculation calculation = ...
calculation.calculate();
Object data = calculation.getData();
Der Aufruf zum Abrufen der Daten blockiert, bis die Berechnung erfolgt. Was genau bedeutet Warten an dieser Stelle?
- Ist es ein arbeitsreiches
- Ist die wartenden Thread Ausbeute, so dass andere Themen (wie das die Berechnung zu tun) wartet fortgesetzt werden kann.
- Geht der wartende Thread schlafen?
- Wird wait/notify hinter der Szene aufgerufen?
Ich bin mir bewusst, dass ich für dieses Beispiel ein Callable
und Future
verwenden könnte, aber das ist neben dem Punkt. Gibt es eine Möglichkeit, solchen Code zu verbessern, um sicherzustellen, dass keine Ressourcen verschwendet werden (wie unnötige Thread-Switches)?
Vielleicht [diese] (http://stackoverflow.com/questions/6584355/how-does-the-synchronize-functionnality-work-in-java) – MadProgrammer