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

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不是线程安全的.你必须自己做锁定.

如果它符合您的需要,请尝试使用ConcurrentLinkedQueueLinkedBlockingDeque,它们是线程安全的,但行为与LinkedList略有不同.


Ben*_*ine 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.
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你可以简单地同步可变对象 - 列表本身,为什么要引入一个额外的锁对象? (6认同)
  • 我通常倾向于选择现有的类而不是实现自己的类.所以我会选择其他两个建议中的一个.但无论如何,谢谢你. (2认同)