很抱歉,如果之前有人问这个,但我找不到我的确切方案。
目前我有一个后台线程,它将一个元素添加到列表中,并每隔几分钟删除旧数据。从理论上讲,列表中一次最多只能有2个项目,并且这些项目是不可变的。我还有多个线程,可以在需要时抓取列表中的第一个元素。在这种情况下,是否有必要在列表上显式序列化操作?我的假设是,由于我只是抓取对元素的引用,如果后台线程从列表中删除元素,那应该无关紧要,因为线程在删除之前已经抓取了引用的副本。可能有更好的方法来做到这一点。谢谢你提前。
答案 0 :(得分:1)
是的,此处仍然需要同步,因为添加和删除不是原子操作。如果一个线程同时调用add(0, new Object())
,则另一个调用remove(0)
,结果是未定义的;例如,remove()
可能最终没有效果。
根据您的使用情况,您可以使用ConcurrentLinkedQueue
之类的非阻止列表类。但是,鉴于您每隔几分钟就推动一次更改,我怀疑您通过避免同步获得了很多性能。