有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当我使用offer和poll独占访问它时,java是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中的一个类,它是poll/offer附带的,并且肯定是线程安全的

先谢谢你

顺便说一句:Collections.synchronizedList(new LinkedList())不会给我访问offer/poll的权限


共 (4) 个答案

  1. # 1 楼答案

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

    LinkedList<RawDataset> samples = (LinkedList)Collections.synchronizedList(new LinkedList<RawDataset>());
    
  2. # 3 楼答案

    LinkedList不是线程安全的。你得自己锁起来

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

  3. # 4 楼答案

    如果您有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.
    }