Является ли 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
.
Ответы
Ответ 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>());