La meilleure façon de prévenir les modifications simultanées exception
Voici le pseudo-code comme suit.
public class MyObject
{
private List<Object> someStuff;
private Timer timer;
public MyObject()
{
someStuff = new ArrayList<Object>();
timer = new Timer(new TimerTask(){
public void run()
{
for(Object o : someStuff)
{
//do some more stuff involving add and removes possibly
}
}
}, 0, 60*1000);
}
public List<Object> getSomeStuff()
{
return this.someStuff;
}
}
Donc, essentiellement, le problème est que d'autres objets ne figurant pas dans le code ci-dessus appel getSomeStuff() pour obtenir la liste de lecture seule. Je suis concurrentmodificationexception dans le thread horloge lorsque cela se produit. J'ai essayé de faire le getSomeStuff méthode synchronisée, et même essayé de blocs synchronisés dans le thread horloge, mais toujours gardé l'obtention de l'erreur. Quelle est la méthode la plus simple de l'arrêt de l'accès simultané de la liste?
OriginalL'auteur thatidiotguy | 2012-04-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
java.util.concurrent.CopyOnWriteArrayList
ou en faire une copie (ou obtenir un tableau avecCollection.toArray
méthode) avant l'itération de la liste dans le fil.En outre, le retrait dans un chaque la construction des pauses itérateur, il n'est donc pas un moyen valable de processus de la liste dans ce cas.
Mais vous pouvez effectuer les opérations suivantes:
ou
Est aussi à noter que si votre code accède à la liste de différents threads et la liste est modifiée, vous devez le synchroniser. Par exemple:
Mais remarque, que les opérations dans les serrures doivent être aussi courts que possible.
ok, voir mes mises à jour concernant la suppression/itération pour les listes.
Je crois que j'ai senti que de faire quelque chose avec Java synchroniser mot-clé aurait été possible, mais vous avez dit que ce n'est pas le cas? Et quels paquets sont ces Verrouillage et ReadWriteLock? Aussi, j'ai juste besoin de verrouiller la liste elle-même lors de l'exécution de la méthode dans le timer est en cours d'exécution, est-ce l'approche que vous recommandez?
Correct. La façon dont vous itérez/supprimer allait se briser en un seul fil de l'environnement. La serrure de la classe en java.util.simultanées paquet. Vous verrouillez pas la liste, mais l'accès. I. e. les opérations avec la liste sont effectuées à l'intérieur des écluses (bien qu'il y est une différence entre lire et écrire opération afin que les lecteurs de ne pas se bloquer les uns les autres).
Je ne vois rien dans le code qui mentionne la liste à tous. Vous êtes juste la construction de ce verrou de l'objet, mais la liste n'est jamais mentionné. Est-il prévenir TOUTE écriture sur n'importe quel objet?
OriginalL'auteur Eugene Retunsky
Vous devez faire une copie de la liste dans
getSomeStuff()
. La publication d'une référence à un champ privé, comme cela le rend efficace du public, de sorte qu'il n'est pas quelque chose que vous voulez faire de toute façon.Aussi, envisager un retour une copie comme une
ImmutableList
ou au moins comme un inmodifiable liste.OriginalL'auteur Adam Zalcman