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

时间:2010-07-29 11:33:14

标签: java multithreading list thread-safety linked-list

我有一个链接列表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的权限。

4 个答案:

答案 0 :(得分:36)

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

如果符合您的需要,请尝试ConcurrentLinkedQueueLinkedBlockingDeque,它们是线程安全的,但行为与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>());