web-dev-qa-db-fra.com

Existe-t-il une liste concurrente dans le JDK Java?

Comment créer une instance de liste simultanée, où je peux accéder aux éléments par index? Le JDK a-t-il des classes ou des méthodes d'usine que je peux utiliser?

238
AlikElzin-kilaka

Il existe une implémentation simultanée de la liste dans Java.util.concurrent . CopyOnWriteArrayList en particulier.

154
user177800

Si vous ne vous souciez pas d'avoir un accès basé sur un index et que vous voulez juste les caractéristiques d'une liste en préservant l'ordre d'insertion, vous pouvez envisager un Java.util.concurrent.ConcurrentLinkedQueue . Puisqu'il implémente Iterable, une fois que vous avez terminé d'ajouter tous les éléments, vous pouvez parcourir le contenu à l'aide de la syntaxe améliorée pour:

Queue<String> globalQueue = new ConcurrentLinkedQueue<String>();

//Multiple threads can safely call globalQueue.add()...

for (String href : globalQueue) {
    //do something with href
}
138
Matt Passell

Vous pouvez très bien utiliser Collections.synchronizedList (List) si tout ce dont vous avez besoin est d’une simple synchronisation d’appel:

 List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());
119
Yanick Rochon

Parce que le fait d’acquérir la position et d’obtenir l’élément à partir de la position donnée nécessite naturellement un certain verrouillage (vous ne pouvez pas demander à la liste d’avoir des modifications structurelles entre ces deux opérations).

L'idée même d'une collection simultanée est que chaque opération est atomique et peut être effectuée sans verrouillage/synchronisation explicite.

Par conséquent, obtenir l'élément à la position n à partir d'un List donné en tant qu'opération atomique n'a pas beaucoup de sens dans une situation où un accès simultané est anticipé.

41
Joachim Sauer