当我使用优惠和专门投票访问LinkedList时,LinkedList线程安全吗?

我有一个链接列表 :samples

protected LinkedList<RawDataset> samples = new LinkedList<RawDataset>();

我将元素追加到线程 1 中的列表中,如下所示:

this.samples.offer(data);

我正在第二个线程中从中检索元素,如下所示:

public RawDataset retrieveSample() {
    return this.samples.poll();
}

这是否被视为线程安全?即使线程 1 和线程 2 都在修改列表,它们也只在列表的头部或尾部这样做,对吧?

如果不是,任何人都可以向我指出Java API中附带/并确保线程安全的类吗?polloffer

提前感谢您。

顺便说一句:不会让我访问 /。Collections.synchronizedList(new LinkedList())offerpoll


答案 1

LinkedList 不是线程安全的。你必须自己做锁定。

尝试并发链接队列LinkedBlockingDeque,如果它符合您的需求,它们是线程安全的,但行为与LinkedList略有不同。


答案 2

如果你有一个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.
}