And*_*ann 23 java multithreading linked-list list thread-safety
我有一个链表samples:
protected LinkedList<RawDataset> samples = new LinkedList<RawDataset>();
Run Code Online (Sandbox Code Playgroud)
我将元素添加到线程1中的列表中,如下所示:
this.samples.offer(data);
Run Code Online (Sandbox Code Playgroud)
我正在第二个线程中从中检索元素,如下所示:
public RawDataset retrieveSample() {
return this.samples.poll();
}
Run Code Online (Sandbox Code Playgroud)
这会被认为是线程安全的吗?即使线程1和2都在修改列表,它们只在列表的头部或尾部专门执行,对吧?
如果不是,任何人都可以指向我的Java API中的类poll/ offer并且肯定是线程安全的吗?
先感谢您.
BTW:Collections.synchronizedList(new LinkedList())不会让我访问offer/ poll.
nos*_*nos 38
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.
}
Run Code Online (Sandbox Code Playgroud)