Является ли LinkedList потокобезопасным, когда я получаю к нему доступ исключительно с помощью предложений и опросов? - PullRequest
21 голосов
/ 29 июля 2010

У меня есть связанный список 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 и обязательно будет поточно-ориентированным?

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

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

Ответы [ 4 ]

37 голосов
/ 29 июля 2010

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

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

9 голосов
/ 29 июля 2010

если у вас есть 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.
}
4 голосов
/ 29 июля 2010

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

1 голос
/ 01 августа 2013

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

LinkedList<RawDataset> samples = (LinkedList)Collections.synchronizedList(new LinkedList<RawDataset>());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...