Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentModificationException偶尔会发生_Java_Android_Parse Platform - Fatal编程技术网

Java ConcurrentModificationException偶尔会发生

Java ConcurrentModificationException偶尔会发生,java,android,parse-platform,Java,Android,Parse Platform,我有一个函数,其中有一行应该是用来防止并发修改异常的 List parseObjectKeys=newarraylist(parseObject.keySet()); 然而,它仍然时不时地发生 private static void convertParseObject(ParseObject parseObject, HashMap<String, HashMap<String, WritableMap

我有一个函数,其中有一行应该是用来防止并发修改异常的 List parseObjectKeys=newarraylist(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());
                    }
                }
            }
        }
    }
}
私有静态void convertParseObject(ParseObject-ParseObject,
HashMap顶层,
ArrayList任务){
if(parseObject!=null){
字符串className=parseObject.getClassName();
String id=parseObject.getObjectId();
如果(!topLevel.containsKey(类名)){
put(className,newhashmap());
}
如果(!topLevel.get(className).containsKey(id)){
final WritableMap flatMap=Arguments.createMap();
flatMap.putString(“class”,className);
flatMap.putString(“id”,id);
if(parseObject.isDataAvailable()){
get(className).put(id,flatMap);
//这是防止ConcurrentModificationException所必需的
List parseObjectKeys=newarraylist(parseObject.keySet());
for(最终字符串键:parseObjectKeys){
对象值=parseObject.get(键);
if(字符串的值实例){
flatMap.putString(键,(字符串)值);
}else if(布尔值实例){
flatMap.putBoolean(键,(布尔)值);
}else if(整数的值实例){
flatMap.putInt(键,(整数)值);
}else if(双精度值实例){
flatMap.putDouble(键,(双)值);
}else if(日期的值实例){
flatMap.putString(key,Utils.toISO8601UTC((日期)值));
}
否则{
if(值!=null&&
!(解析ACL的值实例)){
Log.e(标记,“未知类型:”+value.getClass());
}
}
}
}
}
}

解决方案!!!

像这样添加同步块

private synchronized void convertParseObject() { }

解决方案!!!

像这样添加同步块

private synchronized void convertParseObject() { }

HashMap
不是线程安全的数据结构,因此可以使用
ConcurrentHashMap
而不是
HashMap

使用
ConcurrentHashMapTopLevel
而不是
HashMap顶层

并放置
List parseObjectKeys=new ArrayList(parseObject.keySet());
synchronized
块中


希望能有所帮助。

HashMap
不是线程安全的数据结构,因此您可以使用
ConcurrentHashMap
而不是
HashMap

使用
ConcurrentHashMapTopLevel
而不是
HashMap顶层

并放置
List parseObjectKeys=new ArrayList(parseObject.keySet());
synchronized
块中


希望能有所帮助。

convertParseObject()方法调用多次是否非常频繁?是否有堆栈跟踪?@jiteshmohite是的,它是convertParseObject()方法非常频繁地多次调用?是否有堆栈跟踪?@jiteshmohite是的,在使用HashMap等线程不安全的数据结构的情况下,这并不总是正确的。但是,在并发环境中使用不安全的数据结构不是一个好的做法。它可能会导致不必要的竞争条件和不必要的数据一致性损失。Y从算法的角度来看,我们的答案部分是正确的,但对于HashMap的Objects的内部调用则不正确。在使用HashMap等线程不安全的数据结构的情况下,这并不总是正确的。不过,在并发环境中使用不安全的数据结构并不是一个好的做法。它可能导致不必要的竞争条件和不必要的损失从算法的角度来看,您的答案是部分正确的,但对于HashMap对象的内部调用,您的答案是不正确的