2016-01-02 13 views
6

Ho una classe che è simile a questo:In che modo il metodo attende il rilascio del blocco?

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(); 
    } 
    } 
} 

Questa classe rende alcuni costosi calcoli (TimeWise) ed acquisisce una serratura. Mentre il blocco è attivo, nessuno può recuperare i dati che verranno aggiornati dal calcolo, quindi in effetti devono attendere il completamento del calcolo. Il calcolo effettivo viene eseguito in un thread separato. Se ho il seguente codice:

ExpensiveCalculation calculation = ... 
calculation.calculate(); 
Object data = calculation.getData(); 

La chiamata per recuperare i dati è bloccato fino a quando il calcolo è fatto. Cosa significa esattamente aspettare in questo punto?

  • E 'un occupato in attesa
  • Ha la resa thread in attesa, così altri thread (come quella di fare il calcolo) può procedere.
  • Il thread in attesa si addormenta?
  • È attesa/notifica invocata dietro la scena?

Sono consapevole che per questo esempio potrei usare un Callable e Future, ma che è questo il punto. C'è un modo per migliorare tale codice, per garantire che non vengano sprecate risorse di tempo (come interruttori di thread non necessari)?

+0

Forse [questo] (http://stackoverflow.com/questions/6584355/how-does-the-synchronize-functionnality-work-in-java) potrebbe aiutare – MadProgrammer

risposta

2

E 'un'attesa

occupato No.

Fa la resa thread in attesa, in modo che altri fili (come quello di fare il calcolo) può procedere.

No, blocca, in modo che altri thread possano essere eseguiti.

Il thread di attesa si addormenta?

È bloccato.

È attesa/notifica invocata dietro la scena?

No.

+0

Se la chiamata i rendimenti dei thread, otterrà periodicamente uno slot dove è possibile che provi ad acquisire il lock. Ciò significherebbe che può passare del tempo tra il rilascio di 'lock' dal calcolo e il riacquisire di' lock' per recuperare i dati. È corretto? – hotzst

+0

In realtà, viene utilizzata una sorta di meccanismo "wait/notify", ma questo è un meccanismo di basso livello, che utilizza la funzionalità del sistema operativo. Quindi il thread del cameriere è bloccato, fino a quando non si verifica un evento dal set predefinito. Il blocco del rilascio (in un altro thread) è uno di questi eventi e, dopo questo evento, il thread del cameriere diventa immediatamente accessibile per la pianificazione. – Tsyvarev

Problemi correlati