Bonjour,
J'ai lu la page DVP sur Java et la synchronisation - qui est très bien d'ailleurs. Je rencontre cependant un problème de blocage que la page n'explique pas :
mArray est une simple ArrayList, rien de bloquant dans un add ou un remove. Ces fonctions peuvent être appelées par des threads différents, mais aucun des appelants n'a d'autres verrous que celui-là. Cependant il arrive régulièrement qu'on ait un "begins" sans "ends". Y a-t-il quelque chose qui m'échappe sur la synchronisation ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 /* les noms de variables ont été simplifiés, * les fonctions épurées, mais l'essentiel est là */ public void f1() { if (DEBUG) Log.d(TAG, "begins"); for(int index = 0;index<mInput.size();index++) { synchronized(mArray) { mArray.add(mInput.get(index)); } } if (DEBUG) Log.d(TAG, "ends"); } public void f2(int value) { synchronized(mArray) { for(int index = 0;index<mArray.size();index++) { if(mArray.get(index)==value) mArray.remove(index); } } }
Etant donné le contexte de développement, je n'ai pas la possibilité de faire de tests de débug et dois corriger le bug "à vue". Toute idée est la bienvenue
Merci bien !
Partager