Mam klasy, który jest podobny do tego:Jak jest metoda oczekiwania na zwolnienie blokady?
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();
}
}
}
Ta klasa sprawia, że niektóre drogi (w zależności od czasu) Obliczenia i uzyskuje blokadę. Gdy blokada jest zatrzymana, nikt nie może odzyskać danych, które będą aktualizowane przez obliczenia, więc w efekcie muszą czekać na zakończenie obliczeń. Rzeczywiste obliczenia są wykonywane w osobnym wątku. Jeśli mam następujący kod:
ExpensiveCalculation calculation = ...
calculation.calculate();
Object data = calculation.getData();
Wezwanie do pobierania danych jest zablokowana do momentu obliczenia są wykonywane. Co dokładnie oznacza oczekiwanie w tym momencie?
- jest on zajęty czeka
- Czy wydajność gwint oczekiwania, aby inne nici (jak zajmujący obliczeń) może być kontynuowana.
- Czy oczekująca nić kładzie się spać?
- Czy oczekiwanie/powiadomienie wywoływane jest za sceną?
Jestem świadomy, że dla tego przykładu mogę użyć Callable
i Future
, ale to nie ma znaczenia. Czy istnieje sposób na ulepszenie takiego kodu, aby zagwarantować, że żadne zasoby czasu nie zostaną zmarnowane (jak niepotrzebne przełączniki wątków)?
Może [to] (http://stackoverflow.com/questions/6584355/how-does-the-synchronize-functionnality-work-in-java) może pomóc – MadProgrammer