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?
Il existe une implémentation simultanée de la liste dans Java.util.concurrent . CopyOnWriteArrayList en particulier.
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
}
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>());
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é.