Deadlock / Obtention verrou
Bonjour,
Après avoir épluché plusieurs tutoriels sur la synchronisation en Java, je n'arrive toujours pas à comprendre le blocage d'un thread de mon programme.
Le thread en question est lancé par :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
private synchronized void waitingActions() {
try {
wait();
} catch (InterruptedException e) {
logger.warn(e.toString());
}
}
public void run() {
while (true) {
System.out.println("Waiting...");
waitingActions();
System.out.println("condition treatment");
} |
Il reste donc bloquer en attente d'un notify().
La méthode suivante est ensuite appelée par un autre thread :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
public void addChanges(...) {
for (ChangeType t : ChangeType.values())
if (!pChanges.get(t).isEmpty())
logger.info("Receive...");
Set<ActionAbstract> actions = new HashSet<ActionAbstract>();
System.out.println("block");
synchronized (actionLock) {
actions.addAll(executingActions);
}
System.out.println("unblock"); |
Cette méthode reste bloquer en attente de l'obtention du verrou déclaré de la manière suivante :
Code:
1 2
|
private final Boolean actionLock = true; |
Je n'arrive pas à comprendre pourquoi le verrou n'est pas disponible. J'ai mis des messages sur toutes les autres méthodes (et verrouillages) de la classe et elles ne sont à priori pas appelées. La trace d'exécution obtenue est :
J'ai essayé de reproduire le blocage sur un exemple jouet et je n'ai pas réussi. Je dois surement passer à côté de quelque chose :cry: