java multithreading list thread-safety linked-list

java - ¿LinkedList es seguro para subprocesos cuando estoy accediendo a él con oferta y encuesta exclusivamente?



multithreading thread-safety (4)

No LinkedList no es seguro para subprocesos. Use LinkedBlockingDeque en su lugar

Tengo una lista de samples vinculadas:

protected LinkedList<RawDataset> samples = new LinkedList<RawDataset>();

Estoy agregando elementos a la lista en el hilo 1 de esta manera:

this.samples.offer(data);

Y estoy recuperando elementos de él en un segundo hilo así:

public RawDataset retrieveSample() { return this.samples.poll(); }

¿Esto se consideraría seguro para subprocesos? Aunque los hilos 1 y 2 están modificando la lista, solo lo hacen en la cabeza o en la cola de la lista exclusivamente, ¿no?

Si no es así, ¿alguien me puede indicar una clase en la API de Java que viene con poll / offer y seguramente estará seguro para subprocesos?

Gracias de antemano.

BTW: Collections.synchronizedList(new LinkedList()) no me dará acceso a la offer / poll .


si tiene un JDK, puede ver el código fuente de "Collections.synchronizedList ()". Es simple, por lo que puede crear una copia de este método especializado para obtener LinkedList y funciones de sincronización.

public class SynchronizedLinkedList<T> implements List<T> { private LinkedList<T> list; private Object lock; public void add(T object) { synchronized(lock) { list.add(object); } } // etc. }


Eso es correcto: LinkedList no está sincronizado y por lo tanto no es seguro para subprocesos. Si no desea utilizar las analogías sincronizadas más recientes de LinkedList, es decir, ConcurrentLinkedQueue o LinkedBlockingQueue, puede inicializar LinkedList de la siguiente manera:

LinkedList<RawDataset> samples = (LinkedList)Collections.synchronizedList(new LinkedList<RawDataset>());


LinkedList no es seguro para subprocesos. Tendría que hacer el bloqueo usted mismo.

Pruebe ConcurrentLinkedQueue o LinkedBlockingDeque en su lugar, si se ajusta a sus necesidades, son seguros para la ejecución de subprocesos pero un comportamiento ligeramente diferente que LinkedList.