java - ConcurrentModifcationException 偶尔发生
问题描述
我有一个函数,其中一行据说是为了防止并发修改异常 List parseObjectKeys = new ArrayList<>(parseObject.keySet()); 然而它仍然时不时地发生
private static void convertParseObject(ParseObject parseObject,
HashMap<String, HashMap<String, WritableMap>> topLevel,
ArrayList<Task<Void>> tasks) {
if (parseObject != null) {
String className = parseObject.getClassName();
String id = parseObject.getObjectId();
if (!topLevel.containsKey(className)) {
topLevel.put(className, new HashMap<String, WritableMap>());
}
if (!topLevel.get(className).containsKey(id)) {
final WritableMap flatMap = Arguments.createMap();
flatMap.putString("class", className);
flatMap.putString("id", id);
if (parseObject.isDataAvailable()) {
topLevel.get(className).put(id, flatMap);
// This is required to prevent a ConcurrentModificationException
List<String> parseObjectKeys = new ArrayList<>(parseObject.keySet());
for (final String key : parseObjectKeys) {
Object value = parseObject.get(key);
if (value instanceof String) {
flatMap.putString(key, (String) value);
} else if (value instanceof Boolean) {
flatMap.putBoolean(key, (Boolean) value);
} else if (value instanceof Integer) {
flatMap.putInt(key, (Integer) value);
} else if (value instanceof Double) {
flatMap.putDouble(key, (Double) value);
} else if (value instanceof Date) {
flatMap.putString(key, Utils.toISO8601UTC((Date)value));
}
else {
if (value != null &&
!(value instanceof ParseACL)) {
Log.e(TAG, "Unknown type: " + value.getClass());
}
}
}
}
}
}
解决方案
HashMap
不是线程安全的数据结构,因此您可以ConcurrentHashMap
使用HashMap
.
使用ConcurrentHashMap<String, ConcurrentHashMap<String, WritableMap>> topLevel
而不是
HashMap<String, HashMap<String, WritableMap>> topLevel
.
并放入List<String> parseObjectKeys = new ArrayList<>(parseObject.keySet());
块中synchronized
。
希望它会有所帮助。
推荐阅读
- python - 在烧瓶 HTML 模板中运行 python 模块
- amazon-web-services - 如何将小 S3 文件合并成更大的文件(更大的文件)
- python - 将韩文文本从 xml 文件提取到 csv 文件时出现编码错误
- sql - 合并三个 Big Query 表
- python - 使用 Robot 撰写关键字
- python - Django:出现错误说“在使用这种多对多关系之前需要字段“id”的值”
- python - 是否可以在 python 中导入 .fst 文件
- java - 带有 API 网关的 AWS Java Lambda 函数 - POJO 输入和 OutputStream 输出
- ios - 颤动的Firebase云消息传递未调用onResume方法
- python - 为什么 Plotly 不在 Jupyter Lab 上工作?