2016-01-02 24 views
6

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)?

+0

Może [to] (http://stackoverflow.com/questions/6584355/how-does-the-synchronize-functionnality-work-in-java) może pomóc – MadProgrammer

Odpowiedz

2

jest on zajęty czeka

nr

działa wydajność gwintu oczekiwania, aby inne nici (jak zajmujący obliczeń) można kontynuować.

Nie, blokuje, aby mogły działać inne wątki.

Czy oczekująca nić kładzie się spać?

Jest zablokowany.

Czy za sceną pojawia się oczekiwanie/powiadomienie?

nr

+0

W przypadku powołania Wydajność wątku, okresowo otrzyma slot, w którym będzie mógł spróbować zdobyć blokadę. Oznaczałoby to, że jest możliwe, że upłynie trochę czasu pomiędzy zwolnieniem 'blokady' z obliczeń i ponownym uzyskaniem' blokady' w celu pobrania danych. Czy to jest poprawne? – hotzst

+0

W rzeczywistości używa się jakiegoś mechanizmu 'wait/notify', ale jest to mechanizm niskiego poziomu, który wykorzystuje funkcjonalność systemu operacyjnego. Zatem wątek kelnera jest zablokowany, dopóki nie wystąpi zdarzenie z predefiniowanego zestawu. Zwolnienie blokady (w innym wątku) jest jednym z takich zdarzeń, a po wystąpieniu tego zdarzenia wątek kelnera staje się natychmiast dostępny dla planowania. – Tsyvarev

Powiązane problemy