首页 > 解决方案 > 迭代时向 HashSet 添加元素

问题描述

所以我的程序是paint的一个版本。

它创建了一个画布,并允许我用鼠标在画布上绘画,方法是Point使用 ' 从鼠标中获取 'HashSetIterator

它还通过 a 连接到另一个相同的程序DatagramSocket,并将Point它生成的 's 发送到另一个程序,该程序在它的画布上显示它。

为此,我使用一个Runnable线程来侦听传入Point的 's 并将它们添加到HashSet.

我的问题是我得到了java.util.ConcurrentModificationException,因为我在绘画时通过线程将Point's 添加到HashSet连接的程序中。

我不知道如何解决这个异常,因为我希望画布能够实时更新。


CopyOnWriteArraySet使用我可以简单地替换我的HashSet:)解决了这个问题,感谢您的所有支持!

标签: javamultithreadingiteratorhashset

解决方案


使用ConcurrentSkipListSet而不是HashSet。这个 Set 实现是有序线程安全的。

正如MikeFHay 所提到的,您还可以使用另一个线程安全的Set 实现 - ConcurrentHashMap.KeySetView。它可以通过使用ConcurrentHashMap.newKeySet()方法来实例化。此 Set比ConcurrentSkipListSet更快,并且没有排序


推荐阅读