2013-05-10 3 views
0

Dans un environnement multithread, j'ai un Singleton avec une ArrayList statique. Supposons qu'un thread récupère l'instance et fasse une boucle "for" à ArrayList. Juste en train de lire. Pas de mises à jour Cela pourrait prendre un certain temps pour terminer. Pendant que cela se produit, un autre thread met à jour la ArrayList.Mises à jour Singleton dans un environnement multithread

Qu'adviendra-t-il de la boucle (premier thread)? Idéalement, je voudrais que la boucle "for" se termine avec "old" données et si je reçois l'instance à nouveau, alors pour obtenir le nouvel ensemble de données.

Est-ce que l'astuce dans ce cas est de ne pas utiliser volatile? Ou créer une nouvelle ArrayList à partir de la ArrayList statique pour la boucle "for"? Ou... ?

+1

Il y a beaucoup de ressources ici sur stackoverflow cette discussion: http://stackoverflow.com/questions/2715983/concurrent-threads-adding-to-arraylist-at-same- le temps-ce qui se passe par exemple. – jontro

+0

ArrayList n'est pas thread-safe. Vous devez synchroniser chaque accès à la liste pour avoir un comportement prévisible ou utiliser une liste simultanée (à partir du package java.util.concurrent). Je dirais que, si vous devez poser cette question, vous ne devriez pas faire face à des problèmes de multi-threading. Le multi-threading est vraiment difficile. Lire * Concurrence Java en pratique * par Brian Goetz. –

Répondre

-3

Il est préférable d'utiliser vecteur dans un environnement multi threading au lieu de ArrayList. Le discuter entre le vecteur et ArrayList: http://www.javaworld.com/javaqa/2001-06/03-qa-0622-vector.html

+1

L'utilisation d'un vecteur ne rendra pas le travail d'itération correct car un autre thread ajoute quelque chose à ce dernier pendant l'itération. Vous obtiendrez une ConcurrentModificationException prévisible, c'est tout. Et Vector ne devrait vraiment plus être utilisé. Si vous avez besoin d'une liste synchronisée (qui, la plupart du temps, n'est pas suffisante), utilisez Collections.synchronizedList(). –

Questions connexes