Collection mise à jour lors de l'exécution de l'opération de flux java 8


J'ai un List d'objets qui sont mis à jour régulièrement à partir de quelques threads. Lors de la mise à jour, je souhaite utiliser un flux pour filtrer certains éléments.

Par exemple; disons que j'ai une liste qui est mise à jour régulièrement:

List<MyObject> myList

Maintenant, à un moment donné, j'utilise stream sur cette liste

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

Ce thread-safe étant donné que ma liste est mise à jour à partir de quelques threads?

Author: CodeMonkey, 2015-05-14

1 answers

Le Javadoc de CopyOnWriteArrayList indique ce qui suit:

La méthode d'itérateur de style "snapshot" utilise une référence à l'état du tableau au moment où l'itérateur a été créé. Ce tableau ne change jamais pendant la durée de vie de l'itérateur, donc l'interférence est impossible et l'itérateur est garanti de ne pas lancer ConcurrentModificationException. L'itérateur ne reflétera pas les ajouts, les suppressions ou les modifications de la liste depuis que l'itérateur a été créé.

Donc, oui, votre code devrait être threadsafe. Le flux ignorera tous les ajouts à la liste après son démarrage.

 7
Author: Thilo, 2015-05-14 05:09:23