2016-01-02 13 views
6

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

+0

Vielleicht [diese] (http://stackoverflow.com/questions/6584355/how-does-the-synchronize-functionnality-work-in-java) – MadProgrammer

Antwort

2

Ist es ein arbeitsreiches warten

Nr

Hat die wartenden Thread Ausbeute, so dass andere Themen (wie das die Berechnung zu tun) ablaufen kann.

Nein, es blockiert, so dass andere Threads ausgeführt werden können.

Geht der wartende Thread schlafen?

Es ist blockiert.

Wird wait/notify hinter der Szene aufgerufen?

Nr

+0

Wenn der anruf helfen könnte Thread Erträge, es wird in regelmäßigen Abständen einen Steckplatz erhalten, wo es möglich ist, es zu versuchen und das Schloss zu erwerben. Dies würde bedeuten, dass es möglich ist, dass zwischen der Freigabe von "Sperren" aus der Berechnung und dem Wiedererlangen von "Sperren" einige Zeit verstreichen kann, um die Daten abzurufen. Ist das korrekt? – hotzst

+0

Tatsächlich wird irgendeine Art von "Warten/Benachrichtigen" -Mechanismus verwendet, aber dies ist ein Low-Level-Mechanismus, der Betriebssystemfunktionen verwendet. So wird Kellner-Thread blockiert, bis ein Ereignis aus vordefiniertem Set auftritt. Das Freigeben der Sperre (in einem anderen Thread) ist eines dieser Ereignisse, und nachdem dieses Ereignis eintritt, wird sofort auf den Oberbefehls-Thread zum Planen zugegriffen. – Tsyvarev

Verwandte Themen