Le meilleur moyen de contrôler l'accès simultané à Java collections

Devrais-je utiliser de vieux synchronisé Vecteur de la collection, liste de tableaux avec synchronisation des accès ou des Collections.synchronizedList ou une autre solution pour l'accès simultané?

Je ne vois pas de réponse à ma question sur Questions Connexes, ni dans ma recherche (Faire vos collections thread-safe? n'est pas le même).

Récemment, j'ai dû faire en sorte de tests unitaires sur le GUI parties de notre application (essentiellement l'aide de l'API pour créer des images, ajouter des objets, etc.).
Parce que ces opérations est beaucoup plus rapide que par un utilisateur, il montre un certain nombre de problèmes avec les méthodes d'essayer d'accéder à des ressources n'est pas encore créé ou déjà supprimés.

Une question en particulier, qui se passe dans l'EDT, est venu de marcher une liste de points de vue tout en la modifiant dans un autre thread (obtention d'un ConcurrentModificationException parmi d'autres problèmes).
Ne me demandez pas pourquoi, c'était une liste liée au lieu d'une simple liste de tableau (encore moins que nous avons en général de 0 ou de 1. vue de l'intérieur...), donc j'ai pris le plus commun ArrayList dans ma question (car il a un cousin plus âgé).

De toute façon, pas super familier avec les problèmes de simultanéité, j'ai regardé un peu d'info, et je me demandais quoi choisir entre l'ancien (et probablement obsolète) Vecteur (qui a opérations synchronisées par conception), ArrayList avec un synchronized (myList) { } autour des sections critiques (ajouter/supprimer/marche des opérations) ou à l'aide d'une liste renvoyée par les Collections.synchronizedList (même pas sûr de la façon d'utiliser le dernier).

J'ai finalement choisi la deuxième option, car une autre erreur a été d'exposer l'objet (getViewList (), méthode...) au lieu de fournir des mécanismes pour l'utiliser.

Mais quels sont les avantages et les inconvénients des autres approches?


[MODIFIER] Beaucoup de bons conseils ici, difficile d'en sélectionner un. Je vais choisir la plus détaillée et fournir des liens/la nourriture pour la pensée... 🙂 j'aime Darron l'un de l'autre.

Pour résumer:

  • Comme je le soupçonnais, le Vecteur (et son jumeau maléfique, table de hachage ainsi, sans doute) est en grande partie obsolète, j'ai vu des gens dire à son ancien design n'est pas aussi bon que de nouvelles collections", au-delà de la lenteur de la synchronisation forcée, même dans un seul thread de l'environnement. Si nous le garder, c'est surtout parce que les anciennes bibliothèques (et certaines parties de l'API Java) toujours l'utiliser.
  • Contrairement à ce que je pensais, Collections.synchronizedXxxx ne sont pas des plus modernes que le Vecteur (ils semblent être contemporain des Collections, c'est à dire. Java 1.2!) et pas mieux, en fait. Bon à savoir. En bref, je dois éviter d'eux ainsi.
  • Synchronisation manuelle semble être une bonne solution, après tout. Il pourrait y avoir des problèmes de performance, mais dans mon cas, cela n'est pas grave: les opérations effectuées sur les actions de l'utilisateur, petite collection, pas d'un usage fréquent.
  • java.util.simultanées paquet est utile de garder à l'esprit, en particulier la CopyOnWrite méthodes.

J'espère que j'ai bien compris... 🙂

InformationsquelleAutor PhiLho | 2009-02-18