Подтвердить что ты не робот

Является ли 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.

4b9b3361

Ответ 1

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

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

Ответ 2

Если у вас есть 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.
}

Ответ 3

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

Ответ 4

Это правильно - LinkedList не синхронизирован и, следовательно, не является потокобезопасным. Если вы не хотите использовать более ранние синхронизированные аналогии LinkedList, а именно ConcurrentLinkedQueue или LinkedBlockingQueue, вы можете инициализировать LinkedList следующим образом:

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