2011-12-05 7 views
11

Sto cercando di trovare la documentazione che indica se java.util.concurrent.Future è/non è thread-safe. Ad esempio, posso tranquillamente dare la stessa istanza di Future a più thread, che chiameranno tutti Future.get (...)?java.util.concurrent.Future threadsafe?

Ho testato il codice utilizzando Future in questo modo e sembra funzionare correttamente ma sarei molto più felice se potessi trovare l'aspettativa documentata che il futuro è sicuro per l'accesso concorrente in questo modo.

Grazie.

+2

In sostanza, questo commento è lo stesso della risposta di Nizet: è possibile vedere le garanzie di coerenza della memoria in javk JDK: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package- summary.html # package_description –

+0

È sicuro leggere "Le azioni eseguite dal calcolo asincrono rappresentate da un'azione Future avvenire prima delle successive al recupero del risultato tramite Future.get() in un altro thread." vero per _many_ altri thread e un singolo thread? - La "lettura di un altro thread" indica letteralmente un ** singolo ** altro thread rispetto a molti. Ofc sembra probabile che un futuro implementatore dovrebbe fare di tutto per farlo rompere per molti e lavorare per uno quindi sospetto fortemente che questo sia sicuro nella realtà. – S42

+1

Sì, perché ogni chiamata a 'Future.get()' sarà sotto garanzia "succede prima". È perché ogni chiamata viene compilata nello stesso assembly che coinvolge l'una o l'altra forma di http://en.wikipedia.org/wiki/Memory_barrier –

risposta

9

Dato che Future è destinato a essere utilizzato da più thread (almeno quello che invia, e quello che ne stabilisce il risultato), e dato che la documentazione specifica che esiste una relazione prima-esistente tra il calcolo asincrono e le azioni che si verificano dopo la chiamata get, suppongo che le implementazioni siano thread-safe (almeno implementazioni standard).

+1

Sono fortemente incline a concordare che è quasi certamente sicuro in realtà dato che la sicurezza del thread per succedere - prima di lavorare tra 2 thread normalmente andrebbe bene anche per i thread N, tuttavia non sono chiaro al 100% se posso interpretare l'accadere-prima garantito per molti thread quando la formulazione della garanzia suggerisce un singolo thread. Nonostante questa piccola riserva, sto votando il tuo commento in quanto sembra essere la migliore risposta disponibile. – S42

+1

@ S42 Stai leggendo il testo troppo alla lettera. In Java, non c'è assolutamente nessuna comunicazione speciale tra una coppia di thread; tutti i thread comunicano sincronizzando la memoria ed è ugualmente disponibile per tutti i thread. – toto2

4

Se si utilizza un Future restituito da un ExecutorService, quindi sì, sono garantiti per essere thread-safe. Poiché Future è un'interfaccia, il creatore dell'interfaccia non può garantire che tutte le implementazioni siano comunque thread-safe.

Nizet fa apparire un buon punto però. Il documento dice che le implementazioni dell'interfaccia Future dovrebbero essere thread-safe, non rendere l'implementazione thread-safe violerebbe il contratto del futuro