当我使用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
的权限
# 1 楼答案
这是正确的——LinkedList是不同步的,因此不是线程安全的。如果您不想使用LinkedList较新的同步类比,即ConcurrentLinkedQueue或LinkedBlockingQueue,可以如下初始化LinkedList:
# 2 楼答案
没有LinkedList不是线程安全的。改用LinkedBlockingDeque
# 3 楼答案
LinkedList不是线程安全的。你得自己锁起来
试试ConcurrentLinkedQueue或LinkedBlockingDeque如果它符合您的需要,它们是线程安全的,但与LinkedList的行为略有不同
# 4 楼答案
如果您有JDK,可以查看“Collections.synchronizedList()”的源代码。它很简单,因此您可以创建此方法的副本,专门用于获取LinkedList和同步功能