Java 避免迭代器ConcurrentModificationException的方法

Java 避免迭代器ConcurrentModificationException的方法,java,multithreading,concurrency,iterator,Java,Multithreading,Concurrency,Iterator,据我所知,有两种方法可以避免ConcurrentModificationException,一个线程迭代集合,另一个线程修改集合 客户端锁定,基本上是在迭代期间锁定集合。需要访问集合的其他线程将阻塞,直到迭代完成 克隆集合并迭代副本的“线程受限” 我想知道还有其他选择吗? 因为第一种明显的方式是不受欢迎的,而且性能也很差,如果集合很大,其他线程可能会等待很长时间。第二种方式我不确定,因为我们克隆了集合,并迭代了副本,所以如果其他线程进来并修改了原始线程,那么复制的线程就过时了,对吗?这是否意味着

据我所知,有两种方法可以避免ConcurrentModificationException,一个线程迭代集合,另一个线程修改集合

  • 客户端锁定,基本上是在迭代期间锁定集合。需要访问集合的其他线程将阻塞,直到迭代完成
  • 克隆集合并迭代副本的“线程受限”
  • 我想知道还有其他选择吗?
    因为第一种明显的方式是不受欢迎的,而且性能也很差,如果集合很大,其他线程可能会等待很长时间。第二种方式我不确定,因为我们克隆了集合,并迭代了副本,所以如果其他线程进来并修改了原始线程,那么复制的线程就过时了,对吗?这是否意味着我们需要通过克隆重新开始,并在修改后再次迭代它?

    您可以使用类似的类

    我想知道还有其他选择吗

    使用一个不会引发此异常的并发集合。相反,它们提供了弱一致性。i、 e.迭代时,添加或删除的元素可能会出现,也可能不会出现

    concurrent包包括对java集合框架的许多添加。通过提供的集合接口,可以最容易地对它们进行分类:

    • BlockingQueue定义了一种先进先出的数据结构,当您试图添加到完整队列或从空队列检索时,该结构会阻塞或超时
    • ConcurrentMap是java.util.Map的子接口,它定义了有用的原子操作。这些操作仅在密钥存在时删除或替换键值对,或仅在密钥不存在时添加键值对。使这些操作原子化有助于避免同步。ConcurrentMap的标准通用实现是ConcurrentHashMap,它是HashMap的并发模拟
    • ConcurrentNavigableMap是ConcurrentMap的子接口,支持近似匹配。ConcurrentNavigableMap的标准通用实现是ConcurrentSkipListMap,它是TreeMap的并发模拟

    如果你是写少于读,还有第三种方法可以使用。@AmitD你能解释一下吗?为什么写少于读?它是否像concurrentHashMap一样工作?我想知道哪一个应用最广泛并且更喜欢在实践中使用?在上述两个并行软件包集合中?@user1389813适合您需要的是要使用的。它们不能互换。在您的事业中,您可能需要CopyOnWriteArlarList、CopyOnWriteArraySet、ConcurrentLinkedQue或许多其他并发集合中的一个。您说过“添加或删除的元素在迭代时可能会出现,也可能不会出现”,那么我们如何知道它是否出现?如果您在迭代时看到它,它就会出现。如果您在迭代时没有看到它,它就不会出现。假设您不需要知道是否有另一个线程正在迭代,它可能会看到或可能不会看到您所做的更改。