Действительно ли LinkedList ориентирован на многопотоковое исполнение, когда я получаю доступ к нему с предложением и опросом исключительно?

У меня есть связанный список samples:

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

Я добавляю элементы к списку в потоке 1 как это:

this.samples.offer(data);

И я получаю элементы от него во втором потоке как так:

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

Это рассмотрели бы как ориентированное на многопотоковое исполнение? Даже при том, что поток 1 и 2 оба изменяет список, который они только делают так или на голове или на хвосте списка исключительно, правильно?

Если это не, может любой указывать на меня на класс в Java API, который идет poll/offer и, несомненно, будет ориентировано на многопотоковое исполнение?

Заранее спасибо.

BTW: Collections.synchronizedList(new LinkedList()) не предоставит мне доступ к offer/poll.

23
задан André Hoffmann 29 July 2010 в 11:33
поделиться

3 ответа

LinkedList не является потокобезопасным. Вам придется самому запирать.

Попробуйте вместо этого ConcurrentLinkedQueue или LinkedBlockingDeque , они являются потокобезопасными, но их поведение немного отличается от LinkedList.

38
ответ дан 29 November 2019 в 01:29
поделиться

если у вас есть JDK, вы можете посмотреть исходный код "Collections.synchronizedList()". Он прост, поэтому вы можете создать копию этого метода, специализированную для получения функций LinkedList и синхронизации.

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
ответ дан 29 November 2019 в 01:29
поделиться

Нет LinkedList не является потокобезопасным. Вместо него используйте LinkedBlockingDeque

4
ответ дан 29 November 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: