Java 中使用迭代器时的 ConcurrentModificationException
如果任何特定方法在多线程 Java环境中检测到并发资源时,可能会抛出ConcurrentModificationException异常。在此过程中,对象在此处是一个不可允许的单元。
以下是一个与Java 中的 ConcurrentModificationException相关的示例:
Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:000) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:000) atcom.journaldev.ConcurrentModificationException.ConcurrentModificationExceptio nExample.main(ConcurrentModificationExceptionExample.java:00)
对于此特定过程,异常在以下情况下可获得:
检测到异常并且迭代未在方法中定义。
当进程在使用名为 modCount 的内部标志的快速失败迭代器循环中阻塞时。
Java 中 ConcurrentModificationException 算法
在此可能的算法中,我们将向您展示如何在 Java 环境中执行 java.util.ConcurrentModificationException。通过使用此可能的算法,我们将构建一些 Java 语法,通过它我们将进一步探索一些 Java 方法。
步骤 1 - 启动进程。
步骤 2 - 声明并导入一些 Java 包以运行进程。
步骤 3 - 声明一个公共类。
步骤 4 - 声明一个字符串参数。
步骤 5 - 创建一个数组列表对象的对象。
步骤 6 - 创建一个新的数组列表。
步骤 7 - 填充数组列表。
步骤 8 - 声明一个 try 函数。
步骤 9 - 为列表声明一个打印符号。
步骤 10 - 声明一个迭代器类。
步骤 11 - 继续获取下一个值。
步骤 12 - 在迭代之间添加一个值。
步骤 13 - 打印更新后的数组列表。
步骤 14 - 继续获取下一个值。
步骤 15 - 捕获异常值。
步骤 16 - 打印异常值。
步骤 17 - 获取值。
步骤 18 - 终止进程。
在 Java 中使用迭代器时的 ConcurrentModificationException 语法
for(int i = 0; i<myList.size(); i++){
System.out.println(myList.get(i));
if(myList.get(i).equals("3")){
myList.remove(i);
i--;
myList.add("6");
}
}
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(ELEMENT);
list.add(ELEMENT);
list.add(ELEMENT);
list.add(ELEMENT);
list.add(ELEMENT);
//Add more element if the user wants
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer value = it.next();
System.out.println("List Value:" + value);
if (value.equals(3))
list.remove(value);
}{
HashMap<Integer, Integer> map = new HashMap<>();
map.put(ELEMENT 1, ELEMENT 1);
map.put(ELEMENT 2, ELEMENT 2);
map.put(ELEMENT 3, ELEMENT 3);
Iterator<Integer> it = map.keySet().iterator();
while(it.hasNext()) {
Integer key = it.next();
System.out.println("Map Value:" + map.get(key));
if (key.equals(SEARCH ELEMENT)){
map.put(ELEMENT 1, ELEMENT 4);
}
}
}
}
在上述可能的语法中,我们尝试向您展示如何在 Java 环境中声明和运行一个过程来实现 ConcurrentModificationException。通过使用这些语法,我们正在朝着与给定问题陈述相关的一些可能方法迈进。
遵循的方法
方法 1 - 使用迭代器类、iterator.hasNext() 和元素添加时的 Java 程序中的 ConcurrentModificationException
方法 2 - 通过使用 iterator.next() 函数说明 java.util.ConcurrentModificationException 方法的 Java 程序
方法 1:使用迭代器类、Iterator.hasNext() 和元素添加
迭代器类方法的使用
在此可能的方法中,我们将对特定集合应用迭代方法。当我们遍历时,我们直接应用修改过程进行一些更正。当整个过程无法快速迭代时,在那个特定点发生异常。
for (Iterator<Integer> iterator = integers.iterator(); iterator.hasNext();) {
Integer integer = iterator.next();
if(integer == 2) {
iterator.remove();
}
}
示例
//Java Program to ConcurrentModificationException while using Iterator class
import java.util.ArrayList;
import java.util.Iterator;
public class ARBRDD {
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer value = iterator.next();
System.out.println("value: " + value);
if (value.equals(2)){
System.out.println(
"========================");
System.out.println("removing value: "
+ value);
System.out.println(
"========================");
list.remove(value);
}
}
}
}
输出
value: 1 value: 2 ======================== removing value: 2 ======================== Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at ARBRDD.main(ARBRDD.java:14)
Iterator.hasNext() 方法的使用
在此可能的方法中,我们将使用 iterator .hasNext() 应用修改过程,当迭代后发生修改时,异常会被抛出。我们可以避免此异常时:
迭代完成后进行修改。
当我们应用同步块或方法时。
示例
//Java Program to Avoid ConcurrentModificationException by directly using Iterator with iterator.hasNext()
import java.util.ArrayList;
import java.util.Iterator;
public class ARBRDD {
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer value = iterator.next();
System.out.println("value: " + value);
if (value.equals(2)){
System.out.println(
"========================");
System.out.println("removing value: "
+ value);
System.out.println(
"========================");
iterator.remove();
}
}
}
}
输出
value: 1 value: 2 ======================== removing value: 2 ======================== value: 3 value: 4 value: 5
在列表中使用元素添加方法
在此可能的方法中,我们将向特定数据列表中添加一些数据元素。要从此过程中获得 ConcurrentModificationException,我们可以添加一个新元素来更新列表并从中获取所需的输出。
示例
//Java program to illustrate the ConcurrentModificationException by using as an element is added during the iteration process
import java.util.Iterator;
import java.util.ArrayList;
public class ARBRDDmodificationError {
public static void main(String args[]){
ArrayList<String> arr
= new ArrayList<String>();
arr.add("ARB");
arr.add("Bangladesh");
arr.add("RDD");
arr.add("India");
try {
System.out.println(
"ArrayList: ");
Iterator<String> iter
= arr.iterator();
while (iter.hasNext()) {
System.out.print(iter.next()
+ "-;-");
System.out.println(
"\n\nTrying to add"
+ " an element in "
+ "between iteration\n");
arr.add("Five");
}
}
catch (Exception e) {
System.out.println(e);
}
}
}
输出
ArrayList: ARB-;-Trying to add an element in between iteration java.util.ConcurrentModificationException
方法 2
Iterator.next() 方法的使用
在此可能的方法中,我们将应用 iterator.next() 方法。当 Java 集合类失败时,这意味着当某些线程遍历迭代器时,集合更改了其过程。
HashSet<TableRecord> tableRecords = new HashSet<>();
...
for (Iterator<TableRecord> iterator = tableRecords.iterator();
iterator.hasNext(); ) {
TableRecord record = iterator.next();
if (record.getDependency() == null) {
for (Iterator<TableRecord> dependencyIt = tableRecords.iterator();
dependencyIt.hasNext(); ) {
TableRecord dependency = dependencyIt.next();
if (dependency.getDependency() != null &&
dependency.getDependency().getId().equals(record.getId())) {
tableRecords.remove(record);
}
}
}
}
示例
//Java program to illustrate the java.util.ConcurrentModificationException method by using the iterator.next() function
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class ConcurrentModificationExceptionARBRDDExample {
public static void main(String args[]) {
List<String> myList = new ArrayList<String>();
myList.add("16");
myList.add("07");
myList.add("10");
myList.add("2001");
myList.add("1997");
Iterator<String> it = myList.iterator();
while (it.hasNext()) {
String value = it.next();
System.out.println("List Value Is Here. Have A Look @ARBRDD:- ->" + value);
if (value.equals("2001"))
myList.remove(value);
}
Map<String, String> myMap = new HashMap<String, String>();
myMap.put("16", "16");
myMap.put("07", "07");
myMap.put("1997", "1997");
Iterator<String> it1 = myMap.keySet().iterator();
while (it1.hasNext()) {
String key = it1.next();
System.out.println("Map Value:" + myMap.get(key));
if (key.equals("07")) {
myMap.put("16", "2001");
}
}
}
}
输出
List Value Is Here. Have A Look @ARBRDD:-->16 List Value Is Here. Have A Look @ARBRDD:-->07 List Value Is Here. Have A Look @ARBRDD:-->10 List Value Is Here. Have A Look @ARBRDD:-->2001 Map Value:1997 Map Value:16 Map Value:07
结论
当特定对象尝试以并发方式修改自身时,同时在特定程序中使用迭代器类,可能会遇到 ConcurrentModificationException。今天在这篇文章中,我们学习了并发方法的修改。通过使用上面提到的语法和算法,我们构建了一些 Java 代码以有效地解决问题陈述。
另请参阅: Java 面试问题及答案
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP