Est-il prudent de diffuser une collection simultanée alors qu’elle est modifiée en externe?

J’ai une ConcurrentLinkedQueue accessible par plusieurs threads; les objects qu’il contient sont immuables. Dans un thread, j’ai besoin d’un instantané des données, ce que je fais en appelant stream dessus. Est-ce sûr? Je suis conscient de l’exigence de non-interférence , mais il semble parler de modification à partir de l’une des opérations du stream (“les pipelines de stream dont la source pourrait ne pas être concurrente ne devraient jamais modifier la source de données du stream “), pas nécessairement à l’extérieur. De plus, ConcurrentLinkedQueue est conçue pour un access simultané, donc voilà.

À partir de la documentation en lien que vous avez fournie

Pour la plupart des sources de données, empêcher les interférences signifie s’assurer que la source de données n’est pas du tout modifiée pendant l’exécution du pipeline de stream. L’exception notable à cette règle concerne les stream dont les sources sont des collections simultanées, spécialement conçues pour gérer les modifications simultanées. Les sources de stream simultanées sont celles dont Spliterator rapporte la caractéristique CONCURRENT

D’après la documentation de SplitIterator (sa caractéristique CONCURRENT)

statique finale int CONCURRENT

Valeur caractéristique signifiant que l’élément source peut être modifié de manière concurrente et en toute sécurité (permettant des ajouts, des remplacements et / ou des suppressions) par plusieurs threads sans synchronisation externe. Si tel est le cas, le Spliterator devrait avoir une politique documentée concernant l’impact des modifications pendant la traversée.

Ceci est l’implémentation de la méthode de stream d’interface Collection (qui n’est pas substituée dans ConcurrentLinkedQueue)

 default Stream stream() { return StreamSupport.stream(spliterator(), false); } 

Ainsi, tant que ConcurrentLinkedQueue utilise CONCURRENT SplitIterator (ce qui est le cas), je suppose que vous pouvez itérer en toute sécurité votre ConcurrentLinkedQueue à l’aide de stream ().