web-dev-qa-db-fra.com

LinkedList est-il sûr pour les threads lorsque j'y accède avec l'offre et le sondage exclusivement?

J'ai une liste chaînée samples:

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

J'ajoute des éléments à la liste du fil 1 comme ceci:

this.samples.offer(data);

Et j'en récupère des éléments dans un deuxième fil comme ceci:

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

Serait-ce considéré comme thread-safe? Même si les threads 1 et 2 modifient tous deux la liste, ils ne le font que sur la tête ou la queue de la liste exclusivement, non?

Si ce n'est pas le cas, quelqu'un peut-il me diriger vers une classe de l'API Java fournie avec poll/offer et qui est sûre d'être thread-safe?

Merci d'avance.

BTW: Collections.synchronizedList(new LinkedList()) ne me donnera pas accès à offer/poll.

24
André Hoffmann

LinkedList n'est pas thread-safe. Vous devez faire le verrouillage vous-même.

Essayez ConcurrentLinkedQueue ou LinkedBlockingDeque à la place si cela correspond à vos besoins, leur comportement est sûr pour les threads mais légèrement différent de LinkedList.

40
nos

si vous disposez d'un JDK, vous pouvez consulter le code source de "Collections.synchronizedList ()". C'est simple, vous pouvez donc créer une copie de cette méthode spécialisée pour obtenir à la fois LinkedList et les fonctionnalités de synchronisation.

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.
}
9
Benoit Courtine

Aucune LinkedList n'est pas thread-safe. Utilisez LinkedBlockingDeque à la place

4
nanda

C'est correct - LinkedList n'est pas synchronisé et n'est donc pas sûr pour les threads. Si vous ne souhaitez pas utiliser les nouvelles analogies synchronisées de LinkedList, à savoir ConcurrentLinkedQueue ou LinkedBlockingQueue, vous pouvez initialiser LinkedList comme ceci:

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