当我使用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 ());