diff --git a/src/main/java/org/arl/fjage/Behavior.java b/src/main/java/org/arl/fjage/Behavior.java index f1020a19..d72020a4 100644 --- a/src/main/java/org/arl/fjage/Behavior.java +++ b/src/main/java/org/arl/fjage/Behavior.java @@ -149,9 +149,13 @@ public void run() { * * @see #block() */ - public synchronized void restart() { + public void restart() { blocked = false; - if (agent != null) agent.wake(); + // Use local variable to ensure that the `!= null` and `.wake()` run on the + // same value. Don't use `synchronized` block as that may deadlock with the + // `agent` lock required for `wake()`. + Agent tmp = agent; + if (tmp != null) tmp.wake(); } /** @@ -249,4 +253,3 @@ synchronized void setOwner(Agent agent) { } } -