当我使用offer和poll进行访问时,LinkedList是否是线程安全的?

我有一个链表samples

 protected LinkedList samples = new LinkedList(); 

我将元素添加到线程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和同步function。

 public class SynchronizedLinkedList implements List { private LinkedList list; private Object lock; public void add(T object) { synchronized(lock) { list.add(object); } } // etc. } 

没有LinkedList不是线程安全的。 请改用LinkedBlockingDeque

这是正确的 – LinkedList不同步,因此不是线程安全的。 如果您不想使用LinkedList的较新同步类比,即ConcurrentLinkedQueue或LinkedBlockingQueue,您可以像这样初始化LinkedList:

 LinkedList samples = (LinkedList)Collections.synchronizedList(new LinkedList());