Java序列化导致并发修改异常

时间:2011-04-09 22:01:44

标签: java serialization concurrency

我的程序每秒大约100次更新存储在ArrayList中的数百个对象。我已经实现了Java内置的序列化,除非在对象进行时尝试序列化,否则它很有效。在这种情况下,我可能需要在它运行之前序列化六次(每次失败的尝试都会抛出一个例外)。我尝试将arraylist标记为瞬态,但是当我加载序列化文件时,抛出空指针异常。所以我尝试在no args构造函数中初始化瞬态arraylist,它没有任何帮助。我该怎么办?感谢。

5 个答案:

答案 0 :(得分:3)

首先确保您已同步对ArrayList的访问权限,例如初始化时:

List<String> list = Collections.synchronizedList(new ArrayList<String>());

当您需要序列化它时,请获取由于同步而保持一致的副本:

List<String> copy = new ArrayList<String>(list);

现在,您可以安全地序列化此副本,而不会阻止对主列表的访问。

答案 1 :(得分:0)

您无法使用foreach语句进行迭代并修改表格。

尝试使用

for (int i =0;i<arra.length;i++) 

代替。

答案 2 :(得分:0)

ArrayList复制到新实例(带new ArrayList<>()的浅层副本并序列化。

答案 3 :(得分:0)

如果您遍历集合并同时修改它,请使用Iterator。

答案 4 :(得分:0)

假设您确实不希望或不需要序列化的列表内容声明您的列表成员:

private transient final List<?> things = new ArrayList<Object>();

您将始终使用非空列表。

话虽如此,从声音来看,您对列表本身的更新可能需要考虑其他线程安全问题,如数据争用和可见性问题。