Comment faire pour retourner un thread-safe/immuables de la Collection en Java?
Dans le projet je suis le codage, j'ai besoin de revenir un thread safe et immuable vue à partir d'une fonction. Cependant, je ne suis pas sûr de cela. Depuis synchronizedList
et unmodifiableList
juste retour des vues de liste, je ne sais pas si
Collections.synchronizedList(Collections.unmodifiableList(this.data));
ferait l'affaire.
Quelqu'un pourrait-il me dire si cela est correct, et dans le cas où il n'est pas, il y a toutes les situations que ce serait probablement à l'échec?
Merci pour toutes les entrées!
OriginalL'auteur Ziyao Wei | 2011-07-12
Vous devez vous connecter pour publier un commentaire.
Je trouve cela une véritable lacune dans le JDK. Heureusement, une équipe de plus de Google, dirigé par Java Collections de designer Joshua Bloch, ont créé un bibliothèque qui comprend vraiment immuable collections.
ImmutableList en particulier est l'application que vous recherchez. Ici est un croquis rapide de certaines des caractéristiques de la Goyave est ImmutableCollections.
Je ne sais pas d'un tel ajout dans le JDK 7; je n'en connais pas vraiment d'une liste immuable du JDK 6.
Vous pouvez obtenir le même résultat mais en faisant une copie de la liste d'origine et au retour d'une inmodifiable vue de la copie. Donc, essentiellement, il enregistre uniquement une seule ligne de code, mais si l'on est déjà à l'aide de Goyave pourquoi écrire une ligne de code?
oui et non. Vous avez raison que la inmodifiable vue d'un jeté de copie serait vraiment immuable. Mais, ensuite, supposons que vous êtes le consommateur de cette liste. Vous ne savez pas si le producteur a conservé la liste modifiable ou non. Donc, vous devez faire une défensive copie de vous-même, qui a des coûts associés. Si vous utilisez une liste puisse garantir qu'il ne peut pas être modifiée par n'importe quel moyen, le programmeur peut être sûr que cette étape peut être évitée. Comme une question de fait, si vous essayez de faire une copie défensive de Goyave est ImmutableList, il va vous renvoyer l'instance d'origine.
Il y une preuve de Goyave Immuable Collection est VRAIMENT thread-safe? Je ne suis pas encore sûr. La question n'est pas à propos de changements simultanés, mais à propos de Java modèle de mémoire effets secondaires de la concurrence.
OriginalL'auteur Ray
Je pense que inmodifiable est suffisant. Vous ne pouvez pas écrire, qui est ce qui provoque des problèmes pour les multi-thread d'accès. Elle est en lecture seule, donc, l'étape de synchronisation semble inutile pour moi.
Préférable de vérifier le code source quand il y a des questions de ce genre. Regarde comme elle renvoie un
UnmodifiableList
:Le consommateur serait pas en mesure de modifier la liste, mais la liste pourrait être modifiée si elle est conservée.
C'est correct, tant que la personne ne modifie les "originaux" (non déballé) de la collection. C'est une bonne idée de limiter cette de collections que vous avez construit vous-même. La perte de votre propre référence à l'original une fois que vous l'envelopper avec inmodifiable est aussi une bonne idée. Plus encore est l'utilisation de l'immuable collections mentionnées dans les Rayons de la réponse, car il n'est pas mutable collection accidentellement fuite.
OriginalL'auteur duffymo
Va faire, comme ce sera le retour de vue. Toute modification des tentatives de ce point de vue sera le résultat de
UnsupportedOperationException
être jeté. Ci-dessous sont des extrait deCollections#unmodifiableList
de la documentation.java 8 java.util.Les Collections de javadoc
OriginalL'auteur Awan Biru
Ces points de vue ne sera pas de retour vous avez vraiment thread-safe collections. Il y a toujours la possibilité que quelqu'un va modifier la sauvegarde de la collection, ou les éléments dans la collection.
Pour résoudre ce problème, vous devez utiliser immuable collections et immuable éléments. Ensuite, le fil de sécurité se produit.
Clojure contient de telles immuable (ou persistant) collections.
Mettre simplement en ajoutant ou en retirant des éléments nouveaux renvoie une nouvelle collection, qui, en général, ne réutilisation de grandes parties de l'ancienne collection grâce à l'utilisation intelligente de Trie-type de structures de données.
Sur leur propre, ce sont un mauvais ajustement pour l'utilisation dans droit en Java.
Pure4j est une tentative de port de ces (et l'immuable/valeur basée sur le style préconisé par Clojure) pour le langage Java. Il pourrait être ce que vous êtes après.
Avertissement: je suis le développeur de Pure4J
OriginalL'auteur Rob Moffat