2015-05-14 10 views
6

Ho uno List di oggetti che vengono aggiornati regolarmente da un paio di thread. Durante l'aggiornamento voglio usare uno stream per filtrare alcuni elementi.Raccolta aggiornata durante l'esecuzione dello streaming java 8

Ad esempio; dire che ho lista che viene aggiornata regolarmente:

List<MyObject> myList 

Ora, a un certo punto nel tempo che uso corrente in tale elenco

List<MyObject> result = 
myList.stream().filter(myobj->myobjt.isValid()).collect(toList()); 

È questo thread-safe dato che la mia lista è in corso di aggiornamento da una un paio di discussioni?

+4

Quale implementazione di elenco stai utilizzando? Come stai aggiornando la lista (aggiungendo alla fine o altre cose)? Cosa ti aspetti dal tuo stream con questi aggiornamenti (ignora/include/fail fast/qualcos'altro)? – Thilo

+0

Uso CopyOnWriteArrayList poiché desidero la raccolta sicura dei thread. Aggiungo solo alla fine di una lista. Voglio che il mio stream faccia cose generiche, potrebbe filtrare o aggiornare oggetti all'interno dell'elenco. Ho appena dato un esempio di filtraggio ma può essere qualsiasi cosa – user1409534

risposta

7

I Javadoc of CopyOnWriteArrayList indica:

Il metodo "istantanea" stile iteratore utilizza un riferimento allo stato della matrice al punto che l'iteratore è stato creato. Questo array non cambia mai durante il ciclo di vita dell'iteratore, quindi l'interferenza è impossibile e l'iteratore è garantito non lanciare ConcurrentModificationException. L'iteratore non rifletterà aggiunte, rimozioni o modifiche alla lista da quando è stato creato l'iteratore.

Quindi, sì, il codice deve essere protetto da thread. Lo stream ignorerà tutte le aggiunte all'elenco dopo che è stato avviato.

+0

vedo ... e cosa succede se solo un thread aggiorna un elenco e un altro thread utilizza l'operazione di streaming su tale elenco? – user1409534