Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果两个进程一次更新一个集合,那么会引发哪个异常?_Java_Multithreading_Exception_Collections - Fatal编程技术网

Java 如果两个进程一次更新一个集合,那么会引发哪个异常?

Java 如果两个进程一次更新一个集合,那么会引发哪个异常?,java,multithreading,exception,collections,Java,Multithreading,Exception,Collections,如果应用程序中的两个进程正在更新一个java.util.List对象,那么将引发哪种异常?这取决于具体的List实现(因为它是一个接口,所以没有java.util.List对象)阵列列表说明: 请注意,无法保证迭代器的快速失效行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。Fail fast迭代器尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测bug 这取决于具体

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

这取决于具体的
List
实现(因为它是一个接口,所以没有
java.util.List
对象)<代码>阵列列表说明:

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


这取决于具体的
List
实现(没有
java.util.List
对象,因为它是一个接口)<代码>阵列列表说明:

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


进程不能共享列表。但是,两个线程可以共享一个列表

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


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

进程不能共享列表。但是,两个线程可以共享一个列表

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


简言之,如果您想修改列表并在另一个线程中使用它,您应该使用线程安全的集合。

根据所涉及的实现和确切的时间,可能会产生多种影响:

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

问题在于,可靠地检测是否发生了问题并不比从一开始就防止这些问题发生容易,但用处要小得多。因此,明智的做法是使用并发数据结构和/或同步(视情况而定)。

根据实施和所涉及的确切时间,可能会产生各种影响:

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

问题在于,可靠地检测是否发生了问题并不比从一开始就防止这些问题发生容易,但用处要小得多。因此,明智的方法是使用并发数据结构和/或同步(视情况而定)。

+1:它用于检测ConcurrentModificationException的底层计数器不是易失的确保此异常的唯一方法是在同一线程中修改ArrayList(不使用smae迭代器)+1:它用于检测ConcurrentModificationException的底层计数器不是易失的。;)确保此异常的唯一方法是在同一线程中修改ArrayList(不使用smae迭代器)+1,不过,如果“没有坏事情发生”,我不会称之为“幸运”,因为这只能意味着“只要他正在测试,就没有坏事情发生”。最幸运的结果当然是一个例外。+1,尽管如此,如果“没有坏事情发生”,我不会称之为“幸运”,因为这只能意味着“只要他在测试,就没有坏事情发生”。最幸运的结果当然是一个例外。@Jigar:虽然“你试过了吗?”通常是对简单问题的一个很好的回答,但它并不真正适用于多线程领域:问题是,即使它在简单测试中工作得很好,在生产中也可能会出现可怕的问题。@Jigar:虽然“你试过了吗?”它通常是对简单问题的一个很好的回答,但它实际上并不适用于多线程领域:问题是,即使它在简单测试中工作得很好,但在生产中仍然可能会出现可怕的故障。