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.