在下面的代码中如何避免并发修改异常?
BeanList是Bean对象的列表
Bean bean = BeanList.get(0);
List<Bean> tempList = BeanList.subList(1, BeanList.size());
Collections.sort(tempList);
tempList.add(0, bean);
BeanList.clear();
BeanList.addAll(tempList);
最佳答案
作为将来的参考。尝试将问题简化为最小的编译示例。这使我们的工作更加轻松。在问题中描述所有数据类型。在这里,我们不得不猜测BeanList的数据类型是什么。还遵守Java命名约定。类名以大写字母开头。成员变量以小写字母开头(即beanList而不是BeanList)。格式不正确的代码对于我们(您需要帮助的人)来说很难阅读。提供一个堆栈跟踪,并告诉您代码中的哪一行会导致异常。
您的问题不在Bean类或同步中。
您的问题在于您对子列表进行操作的方式。
List.subList()并未真正创建新列表。它在现有列表中创建一个“视图”,并与原始列表共享数据结构。当您清除原始列表的内容时,也会清除子列表的内容,然后当您尝试访问该子列表(其数据已更改)时,您将获得异常。
创建一个新列表,将子列表中的所有元素添加到该列表中。
List<Bean> tempList = new ArrayList<Bean>();
tempList.addAll(list.subList(1, list.size()));