gpt4 book ai didi

java - 使用流时出现 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-02 03:26:55 28 4
gpt4 key购买 nike

我明白了

ConcurrentModificationException(java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1558)) 

我怀疑我需要等到HashSet(nodeRefsWithTags)完全填充后再处理它。或者有人有其他建议吗?

函数getTagRefs(sagerRef)被递归调用并填充nodeRefsWithTags

nodeRefsWithTags = new HashSet<>();
getTagRefs(sagerRef);

List<Tag> tags = nodeRefsWithTags.stream()
.map(nodeRef -> ((List<NodeRef>)nodeService.getProperty(nodeRef, ContentModel.PROP_TAGS)))
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.map(taggingService::getTagName)
.collect(Collectors.groupingBy(tagName -> tagName, Collectors.counting()))
.entrySet().stream()
.map(map -> new Tag(map.getKey(), map.getValue()))
.collect(Collectors.toList());

最佳答案

我没有看到当前代码在哪里修改了该集合。因此,对象成员nodeRefsWithTags似乎可以被其他线程访问,并且必须有另一个并发线程修改它。当您流式传输设置的项目时,不能保证不会进行任何修改。有一些选项:

创建副本:

// At this point, you have to make sure nodeRefsWithTags is not modified by other threads.
Set<...> copy = new HashSet<>(nodeRefsWithTags);
// From now on it's ok to modify the original set
List<Tag> tags = copy.stream()...

使用 ConcurrentHashMap :

// For this option you have to make sure that no elements get removed from the map, else you
// might get an endless loop (!) which is very hard to find and may occur occationally only.
nodeRefsWithTags = Collections.newSetFromMap(new ConcurrentHashMap<>());

或者使用普通同步(所有修改都需要锁以及您发布的代码)。

关于java - 使用流时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56903774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com