En Java: Est List.iterator() thread-safe, c'est à dire ne l'itérateur renvoyé de refléter l'état actuel de la liste à tout moment, ou tout simplement l'état de la liste au moment de sa création?
Le comportement de la Liste.iterator() n'est pas défini ou compatible avec différentes Liste des implémentations.
Pour ArrayList, LinkedList, vous pouvez obtenir un ConcurrentModificationException si la liste est modifié lorsque vous êtes itération sur elle. (Ce n'est pas garanti) La façon d'éviter ce problème est d'utiliser un synchronizedList() et de verrouillage de la liste lors de l'itération sur elle.
Vecteur, la collection est synchronisée, mais l'itérateur n'est pas thread-safe.
Pour CopyOnWriteArrayList, vous obtenez un instantané des éléments dans la liste au moment de l'appel iterator(), Cet itérateur est thread-safe, et vous n'avez pas besoin d'utiliser de verrouillage. Remarque: le contenu des éléments peuvent changer.
Pas itérateur est thread-safe. Si la collection sous-jacente est changé au milieu de l'itération, un ConcurrentModificationException est levée.
Même les itérateurs de la synchronisation des collections ne sont pas thread-safe, vous devez synchroniser manuellement.
Seule exception est la CopyOnWriteArrayList, qui détient un instantané au cours d'une itération.
"Pas de itérateur est thread-safe, sauf un," pourrait avoir été écrit en tant que "Toutes les sont thread-safe à l'exception de deux ou trois" 😉
Si la collection sous-jacente est modifié au cours d'une itération par un autre thread, CME peut être jeté ou peut-être pas jeté, depuis la modification interne du compteur n'est pas atomique.
Le comportement de la Liste.iterator() n'est pas défini ou compatible avec différentes Liste des implémentations.
Pour ArrayList, LinkedList, vous pouvez obtenir un ConcurrentModificationException si la liste est modifié lorsque vous êtes itération sur elle. (Ce n'est pas garanti) La façon d'éviter ce problème est d'utiliser un synchronizedList() et de verrouillage de la liste lors de l'itération sur elle.
Vecteur, la collection est synchronisée, mais l'itérateur n'est pas thread-safe.
Pour CopyOnWriteArrayList, vous obtenez un instantané des éléments dans la liste au moment de l'appel iterator(), Cet itérateur est thread-safe, et vous n'avez pas besoin d'utiliser de verrouillage. Remarque: le contenu des éléments peuvent changer.
Pas itérateur est thread-safe. Si la collection sous-jacente est changé au milieu de l'itération, un
ConcurrentModificationException
est levée.Même les itérateurs de la synchronisation des collections ne sont pas thread-safe, vous devez synchroniser manuellement.
Seule exception est la
CopyOnWriteArrayList
, qui détient un instantané au cours d'une itération.