From 89fed559e840a6b8bedc152190df6e98f4dc48a0 Mon Sep 17 00:00:00 2001 From: Roger3581321 Date: Fri, 17 Jul 2026 10:45:28 +0800 Subject: [PATCH] fix: race condition in AdviceListenerManager causing lost listeners (#3237) --- .../core/advisor/AdviceListenerManager.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerManager.java b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerManager.java index 36abe3d90..5c0c8eb9f 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerManager.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerManager.java @@ -197,7 +197,10 @@ public class AdviceListenerManager { if (manager == null) { manager = new ClassLoaderAdviceListenerManager(); - adviceListenerMap.put(classLoader, manager); + ClassLoaderAdviceListenerManager existing = adviceListenerMap.putIfAbsent(classLoader, manager); + if (existing != null) { + manager = existing; + } } manager.registerAdviceListener(className, methodName, methodDesc, listener); } @@ -228,7 +231,10 @@ public class AdviceListenerManager { if (manager == null) { manager = new ClassLoaderAdviceListenerManager(); - adviceListenerMap.put(classLoader, manager); + ClassLoaderAdviceListenerManager existing = adviceListenerMap.putIfAbsent(classLoader, manager); + if (existing != null) { + manager = existing; + } } manager.registerTraceAdviceListener(className, owner, methodName, methodDesc, listener); } @@ -258,7 +264,10 @@ public class AdviceListenerManager { if (manager == null) { manager = new ClassLoaderAdviceListenerManager(); - adviceListenerMap.put(classLoader, manager); + ClassLoaderAdviceListenerManager existing = adviceListenerMap.putIfAbsent(classLoader, manager); + if (existing != null) { + manager = existing; + } } manager.registerLineAdviceListener(className, methodName, methodDesc, lineNumber, listener); }