У меня есть связанный список 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
.
LinkedList не является потокобезопасным. Вам придется самому запирать.
Попробуйте вместо этого ConcurrentLinkedQueue или LinkedBlockingDeque , они являются потокобезопасными, но их поведение немного отличается от LinkedList.
если у вас есть 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.
}
Нет LinkedList не является потокобезопасным. Вместо него используйте LinkedBlockingDeque