我有一个链接列表samples
:
protected LinkedList<RawDataset> samples = new LinkedList<RawDataset>();
我将元素添加到线程1中的列表中,如下所示:
this.samples.offer(data);
我正在第二个线程中从中检索元素,如下所示:
public RawDataset retrieveSample() {
return this.samples.poll();
}
这会被视为线程安全吗?即使线程1和2都在修改列表,它们只在列表的头部或尾部专门执行,对吧?
如果不是,任何人都可以指向我poll
/ offer
附带的Java API中的一个类,并且肯定是线程安全的吗?
提前谢谢。
BTW:Collections.synchronizedList(new LinkedList())
不会授予我访问offer
/ poll
的权限。
答案 0 :(得分:36)
LinkedList不是线程安全的。你必须自己做锁定。
如果符合您的需要,请尝试ConcurrentLinkedQueue或LinkedBlockingDeque,它们是线程安全的,但行为与LinkedList略有不同。
答案 1 :(得分:9)
如果您有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.
}
答案 2 :(得分:4)
没有LinkedList不是线程安全的。请改用LinkedBlockingDeque
答案 3 :(得分:1)
这是正确的 - LinkedList不同步,因此不是线程安全的。如果您不想使用LinkedList的较新同步类比,即ConcurrentLinkedQueue或LinkedBlockingQueue,您可以像这样初始化LinkedList:
LinkedList<RawDataset> samples = (LinkedList)Collections.synchronizedList(new LinkedList<RawDataset>());