java - ConcurrentModifcationException 偶尔发生

标签 java android parse-platform

我有一个函数,其中一行据说是为了防止并发修改异常 列表 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 block 。

希望对您有所帮助。

关于java - ConcurrentModifcationException 偶尔发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759264/

相关文章:

java - Bukkit API 如何将 Material 数据设置到项目堆栈

java - ResultSet 的 JDBC 超时我做得对吗?

android - 如何将解析推送发送到特定地理点附近的设备和 channel ?

ios - 取消互联网连接不良时的解析重试

android - WorkManager 的 OneTimeWorkRequest 的重试策略/机制是什么

javascript - 使用 Promise 和 Parse Javascript 代码来避免异步任务

java - org.springframework.web.servlet.DispatcherServlet noHandlerFound

java - Java中使用模式匹配查找不包含数字的字符串数据

android - 输入第一个字符时,软键盘将布局向上推

android - 关闭 Android Studios 糟糕的风格建议?