bug再现
F:\Java\jdk1.8.0_121\bin\java.exe "-javaagent:F:\JetBrains\IntelliJ IDEA 2018.1.6\lib\idea_rt.jar=63654:F:\JetBrains\IntelliJ IDEA 2018.1.6\bin" -Dfile.encoding=UTF-8 -classpath F:\Java\jdk1.8.0_121\jre\lib\charsets.jar;F:\Java\jdk1.8.0_121\jre\lib\deploy.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;F:\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;F:\Java\jdk1.8.0_121\jre\lib\javaws.jar;F:\Java\jdk1.8.0_121\jre\lib\jce.jar;F:\Java\jdk1.8.0_121\jre\lib\jfr.jar;F:\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;F:\Java\jdk1.8.0_121\jre\lib\jsse.jar;F:\Java\jdk1.8.0_121\jre\lib\management-agent.jar;F:\Java\jdk1.8.0_121\jre\lib\plugin.jar;F:\Java\jdk1.8.0_121\jre\lib\resources.jar;F:\Java\jdk1.8.0_121\jre\lib\rt.jar;G:\lianxi\springboot\juc\target\classes;F:\maven\repository\org\springframework\boot\spring-boot-starter\2.2.1.RELEASE\spring-boot-starter-2.2.1.RELEASE.jar;F:\maven\repository\org\springframework\boot\spring-boot\2.2.1.RELEASE\spring-boot-2.2.1.RELEASE.jar;F:\maven\repository\org\springframework\spring-context\5.2.1.RELEASE\spring-context-5.2.1.RELEASE.jar;F:\maven\repository\org\springframework\spring-aop\5.2.1.RELEASE\spring-aop-5.2.1.RELEASE.jar;F:\maven\repository\org\springframework\spring-beans\5.2.1.RELEASE\spring-beans-5.2.1.RELEASE.jar;F:\maven\repository\org\springframework\spring-expression\5.2.1.RELEASE\spring-expression-5.2.1.RELEASE.jar;F:\maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.2.1.RELEASE\spring-boot-autoconfigure-2.2.1.RELEASE.jar;F:\maven\repository\org\springframework\boot\spring-boot-starter-logging\2.2.1.RELEASE\spring-boot-starter-logging-2.2.1.RELEASE.jar;F:\maven\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\maven\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;F:\maven\repository\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;F:\maven\repository\org\slf4j\jul-to-slf4j\1.7.29\jul-to-slf4j-1.7.29.jar;F:\maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;F:\maven\repository\org\springframework\spring-core\5.2.1.RELEASE\spring-core-5.2.1.RELEASE.jar;F:\maven\repository\org\springframework\spring-jcl\5.2.1.RELEASE\spring-jcl-5.2.1.RELEASE.jar;F:\maven\repository\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;F:\maven\repository\org\slf4j\slf4j-api\1.7.29\slf4j-api-1.7.29.jar com.example.juc.entity.Test
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c]
Exception in thread "2" Exception in thread "7" Exception in thread "6" Exception in thread "4" Exception in thread "1" Exception in thread "3" Exception in thread "16" Exception in thread "9" Exception in thread "23" Exception in thread "24" Exception in thread "27" Exception in thread "25" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a]
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3]
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c]
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6]
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c]
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c, faf8f5a6-2]
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c, faf8f5a6-2, 1a06c45f-5, 945fefd6-6]
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d]
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c, faf8f5a6-2, 1a06c45f-5, 945fefd6-6, 685ec419-5, f305b875-c, fc724a44-0, 50f2ea59-a, 38b82681-f, 9ae1ef9f-7]
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c, faf8f5a6-2, 1a06c45f-5, 945fefd6-6, 685ec419-5, f305b875-c, fc724a44-0, 50f2ea59-a, 38b82681-f, 9ae1ef9f-7, 74661e01-4]
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5]
at java.lang.String.valueOf(String.java:2994)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c]
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c, faf8f5a6-2, 1a06c45f-5, 945fefd6-6, 685ec419-5, f305b875-c, fc724a44-0, 50f2ea59-a, 38b82681-f, 9ae1ef9f-7, 74661e01-4, d01f6c9a-c]
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c, faf8f5a6-2, 1a06c45f-5, 945fefd6-6, 685ec419-5, f305b875-c, fc724a44-0]
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1, ce25d0ba-c, faf8f5a6-2, 1a06c45f-5]
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3, 7cd1c317-1]
at java.lang.String.valueOf(String.java:2994)
[null, null, 0312a4f3-6, 5eac6ecc-e, 73138495-9, 0ac213ad-0, e8be9fee-1, f402ebc8-c, b02c0889-c, 3d59d254-d, ec0aa6ec-5, 0755877d-6, 32da7f02-c, 76139987-a, 4c8ff8a7-3, c971d789-4, 1a57b7df-3]
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.example.juc.entity.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:745)
Process finished with exit code 0
错误代码
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 1; i <= 30; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 10));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
解决方案1
public class Test {
public static void main(String[] args) {
List<String> list = new Vector<>();
for (int i = 1; i <= 30; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 10));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
打印结果:
解决方案2:
public class Test {
public static void main(String[] args) {
List<String> list = Collections.synchronizedList(new ArrayList<>());
for (int i = 1; i <= 30; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 10));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
打印结果:
解决方案3:
package com.example.juc.entity;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 1.故障现象: java.util.ConcurrentModificationException
* 2.导致原因:
* 3.解决办法:
* 3.1.new Vector<>();
* 3.2.Collections.synchronizedList(new ArrayList<>());
* 3.3.new CopyOnWriteArrayList();
*/
public class Test {
public static void main(String[] args) {
List<String> list = new CopyOnWriteArrayList();
for (int i = 1; i <= 30; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 10));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
打印结果: