如果两个进程一次更新一个Collection,那么将引发哪个异常?

时间:2011-03-23 09:04:18

标签: java multithreading exception collections

如果应用程序中的两个进程正在更新一个java.util.List对象,那么将引发哪种异常?

3 个答案:

答案 0 :(得分:2)

这取决于确切的List实现(没有java.util.List个对象,因为它是一个接口)。 ArrayList声明:

  

请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬性保证。失败快速的迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序以确保其正确性是错误的:迭代器的故障快速行为应仅用于检测错误。

答案 1 :(得分:2)

根据实施情况和确切的时间安排,可能会产生各种各样的影响:

  • 你可能会“幸运”而且没有什么不好的事情发生(这个可能甚至是常见的情况)。
  • 您可能会获得ConcurrentModificationException
  • 你可能不会得到一个例外而只是失去一个更新(或两者都有!)
  • 你可能没有得到异常,其中一个更新可能会在无限循环中丢失(发生在我身上HashMap一次,对于简单的List实现不太可能,但仍然可能可能的)
  • 您可能无法获得异常并在列表中引入错误的状态(例如,正确插入一个元素,后跟null元素。)

问题在于,如果发生问题,可靠检测并不比首先防止发生这些问题容易得多,但效果要差得多。因此,理智的方法是在适当时使用并发数据结构和/或同步。

答案 2 :(得分:0)

进程无法共享列表。但是两个线程可以共享一个列表。

某些列表支持并发更新,不会产生异常。其他列表不支持并发更新,可能会产生异常,但这并不是所有操作的保证。

简而言之,如果你想修改List并在另一个线程中使用它,你应该使用线程安全集合。