sto usando un oggetto di mappa nella mia classe che ho sincronizzato con Collections.synchronizedMap() per un LinkedHashMap in questo modo:ConcurrentModificationException anche con l'utilizzo di Collections.sychronizedMap su un LinkedHashMap
private GameObjectManager(){
gameObjects = Collections.synchronizedMap(new LinkedHashMap<String, GameObject>());
}
Sono ottenere un'eccezione modifica simultanea nella terza riga di questa funzione:
public static void frameElapsed(float msElapsed){
if(!INSTANCE.gameObjects.isEmpty()){
synchronized(INSTANCE.gameObjects){
for(GameObject object : INSTANCE.gameObjects.values()){...}
}
}
}
Tutti gli altri luoghi in cui sto scorrendo la mappa, si esegue la sincronizzazione sulla mappa per la documentazione.
Ci sono altre funzioni nella mia classe che usano questa mappa (quella sincronizzata!) E mettono oggetti() e remove(), ma questo non dovrebbe avere importanza. Che cosa sto facendo di sbagliato? Per favore chiedete altro codice, non sapete cos'altro mettere.
Oh, e il messaggio di log:
08-20 15:55:30.109: E/AndroidRuntime(14482): FATAL EXCEPTION: GLThread 1748
08-20 15:55:30.109: E/AndroidRuntime(14482): java.util.ConcurrentModificationException
08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:350)
08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$ValueIterator.next(LinkedHashMap.java:374)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GameObjectManager.frameElapsed(GameObjectManager.java:247)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GamekitInterface.render(Native Method)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GamekitInterface.renderFrame(GamekitInterface.java:332)
08-20 15:55:30.109: E/AndroidRuntime(14482): at com.qualcomm.QCARSamples.ImageTargets.GameEngineInterface.onDrawFrame(GameEngineInterface.java:107)
08-20 15:55:30.109: E/AndroidRuntime(14482): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
08-20 15:55:30.109: E/AndroidRuntime(14482): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
si dovrebbe usare gameObjects ** ** qualunque funzioni utilizzano se si chiama due volte GameObjectManager(); le prime e le seconde gameObjects gameObjects non sono lo stesso oggetto, in modo da può provocare ConcurrentModificationException –
Non capisco quello che hai detto. Ma ho notato che dovrei farlo è test vuoto dopo la sincronizzazione. E 'quello che hai detto? – mpellegr