Java 如果对象包含在列表中,为什么LinkedList.indexOf()返回-1?
我声明了一个LinkedList,其中Frame是我的列表项Java 如果对象包含在列表中,为什么LinkedList.indexOf()返回-1?,java,linked-list,Java,Linked List,我声明了一个LinkedList,其中Frame是我的列表项 private LinkedList<Frame> linkedList = new LinkedList<Frame>(); 我忽略了什么吗?知道发生了什么事吗 我正在从不同的线程访问列表,没有同步。这会导致问题吗 -- 日志(见下文): 仔细查看javadocs中的包含和索引。它指出,这些方法通过使用equals方法确定元素是否在集合中 如果contains和indexOf表示“它不存在”,则列表中存在的
private LinkedList<Frame> linkedList = new LinkedList<Frame>();
我忽略了什么吗?知道发生了什么事吗
我正在从不同的线程访问列表,没有同步。这会导致问题吗
--
日志(见下文):
仔细查看javadocs中的
包含和索引。它指出,这些方法通过使用equals
方法确定元素是否在集合中
如果contains
和indexOf
表示“它不存在”,则列表中存在的对象与您正在测试的对象不同。。。根据对象的equals(object)
实现
另一种可能是您正在从不同的线程访问/更新集合,并且没有正确同步。这可能会导致一个线程看到列表的过时或不一致版本
如果我同步列表本身,您认为我可以吗
Collections.synchronizedList(new LinkedList<>())
Collections.synchronizedList(新的LinkedList())
如果您通过synchronized list执行所有操作,并且不使用迭代器,那么每个操作都将是线程安全的原子操作。然而:
- “同步列表”的迭代器未同步,并且
- 如果您需要以原子方式同步/执行一系列操作,则这没有帮助
例如:
List<Integer> l = Collections.synchronizedList(new LinkedList<>());
// Make the list visible to other threads ...
for (int i = 0; i < l.size(); i++) {
Integer ii = l.get(i);
...
}
List l=Collections.synchronizedList(新的LinkedList());
//使列表对其他线程可见。。。
对于(int i=0;i
虽然l.size()
将始终给出当前大小,但大小可能会在l.size()
和l.get(i)
调用之间更改,从而可能导致异常
简言之<代码>集合。synchronizedList(…)
不是所有涉及列表的线程安全问题的解决方案。你仍然需要考虑你在做什么。你的框架
类型如何实现等于(对象)
?一点也不。我需要实现它吗?不需要,它将继承对象
的实现,它应该适用于包含
和索引的
情况。请给我们一个可复制的例子。您是否正确地同步了所有内容?读和写?您还需要将对列表的访问放在同步块中,例如:synchronized(linkedList){//your code}“另一种可能是,您正在从不同的线程访问/更新集合,并且没有正确同步。这可能会导致一个线程看到列表的过时或不一致版本。“->这正是发生的情况。尽管已经回答了这一问题,但这里有一个链接很好地解释了不同线程如何看到同一变量的不同版本:-对于了解并发性也很好。
Collections.synchronizedList(new LinkedList<>())
List<Integer> l = Collections.synchronizedList(new LinkedList<>());
// Make the list visible to other threads ...
for (int i = 0; i < l.size(); i++) {
Integer ii = l.get(i);
...
}