¿Existe una lista concurrente en el JDK de Java?
¿Cómo puedo crear una instancia de Lista concurrente, donde pueda acceder a elementos por índice? ¿Tiene el JDK alguna clase o método de fábrica que pueda usar?
ConcurrentLinkedQueue
Si no le importa tener acceso basado en índices y solo desea las características de preservación del orden de inserción de una Lista, podría considerar un archivo java.util.concurrent.ConcurrentLinkedQueue
. Dado que implementa Iterable, una vez que haya terminado de agregar todos los elementos, puede recorrer los contenidos utilizando la sintaxis for mejorada:
Queue<String> globalQueue = new ConcurrentLinkedQueue<String>();
//Multiple threads can safely call globalQueue.add()...
for (String href : globalQueue) {
//do something with href
}
Hay una implementación de lista concurrente en java.util.concurrent : CopyOnWriteArrayList .
Copia la lista de "todas las operaciones mutativas ( add
, set
etc.)" , por lo que funciona mejor para aplicaciones con mucha lectura.
Descargo de responsabilidad : esta respuesta se publicó en 2011, antes de JDK 5 y antes de API concurrentes óptimas y avanzadas. Entonces, si bien lo siguiente funcionará , no es la mejor opción.
Puedes usar Collections.synchronizedList(List) si todo lo que necesitas es una simple sincronización de invocación:
List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());
Porque el acto de adquirir la posición y obtener el elemento de la posición dada naturalmente requiere cierto bloqueo (no se puede hacer que la lista tenga cambios estructurales entre esas dos operaciones).
La idea misma de una colección concurrente es que cada operación por sí sola es atómica y se puede realizar sin bloqueo/sincronización explícito.
Por lo tanto, colocar el elemento en posición n
a partir de una operación atómica dada List
no tiene mucho sentido en una situación en la que se prevé acceso concurrente.