Java 此代码块的并发修改异常,请提供帮助?

Java 此代码块的并发修改异常,请提供帮助?,java,data-structures,arraylist,Java,Data Structures,Arraylist,missedMSRB是一个包含2187个元素的列表,当尝试运行下面的代码段时 List<List<String>> subList = getSubList(missedMSRB, 1000); for (List<String> subMSRB : subList) { StringBuffer sql = new StringBuffer(NamedQueries.msSQL); sql.append("(")

missedMSRB是一个包含2187个元素的列表,当尝试运行下面的代码段时

List<List<String>> subList = getSubList(missedMSRB, 1000);

    for (List<String> subMSRB : subList) {

        StringBuffer sql = new StringBuffer(NamedQueries.msSQL); 
        sql.append("(");

        for (int i1 = 0; i1 < subMSRB.size(); i1++) {  //Line 463 Throws Exception

            if (i1 < subMSRB.size() - 1) {
                sql.append("?,");
            } else {
                sql.append("? )");

            }

        } ....
下面的剩余代码

PreparedStatement psMSQL2 = msSQL.prepareStatement(sql.toString());

    psMSQL2.setString(1, runDate);
    psMSQL2.setString(2, runDate2);

    int i = 3;
    for (String s : subMSRB) {
        psMSQL2.setString(i, s.trim());
        i++;
    }

    ResultSet msSQL = psMSQL2.executeQuery();
    logger.debug("SQL executed");

    while (msSQL.next()) {
        missedMSRB.remove(msSQL.getString(1));
    }
getSubList impl//已更正

publicstaticlist getSubList(List-inputList,int-subListSize){
int listSize=inputList.size();
int=listSize/subListSize;
int remainingListSize=listSize%subListSize;
列表子列表=新的ArrayList();
for(int i=0;i
getSubList
中,您可以使用
inputList.subList
创建多个列表。在
ArrayList
中实现的
List
中的此方法不会创建新列表。相反,它返回一个
inputList
视图,因此由
inputList
支持

inputList
的任何修改都会影响子列表。您已在as
inputList
中通过了
missedMSRB
,因此对
missedMSRB
的任何修改都将影响
子列表

因此,当您在外部
for
循环中调用
missedMSRB.remove
时,您将为
子列表中的所有列表创建一个
ConcurrentModification
。然后在
子列表中检查其中一个列表的大小时,它抛出
ConcurrentModificationException

为了解决这个问题,您可以创建一个新列表,而不是直接使用子列表的结果:

subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex)));
subList.add(新的ArrayList(inputList.subList(fromIndex,toIndex));

还有其他线程修改列表吗?是否有其他线程正在修改subMSRB
?(根据你的示例代码没有显示)除非我遗漏了什么,否则这里没有足够的信息来解释这个问题。如果在迭代过程中更改
列表
,则会得到一个
ConcurrentModificationException
。您可以发布更多代码吗?根据请求添加代码此
missedMSRB。删除
更改
missedMSRB
列表,该列表由
subMSRB
使用,因为
inputList。子列表
返回同一列表上的视图,而不是不同的列表。谢谢问题解决。更新了getSubList impl.)
public static List<List<String>> getSubList(List<String> inputList, int subListSize) {

        int listSize = inputList.size();
        int noOfLoops = listSize / subListSize;
        int remainingListSize = listSize % subListSize;

        List<List<String>> subList = new ArrayList<List<String>>();

        for (int i = 0; i < noOfLoops; i++) {
            int fromIndex = i * subListSize;
            int toIndex = (fromIndex) + subListSize;
            subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex)));

            if ((remainingListSize != 0)
                    && (toIndex == (listSize - remainingListSize))) {
                subList.add(new ArrayList<String>(inputList.subList(toIndex, listSize)));

            }
        }

        return subList;

    }
subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex)));