diff --git a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java index d0686124ae5..6702a71fc9a 100644 --- a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java +++ b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java @@ -18,6 +18,7 @@ import java.util.Collection; import java.util.Stack; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import org.apache.seata.common.lock.ResourceLock; @@ -39,19 +40,22 @@ public class LoopContextHolder { private final Stack forwardCounterStack = new Stack<>(); private Collection collection; private final ResourceLock lock = new ResourceLock(); + private static final ConcurrentHashMap LOCK_MAP = new ConcurrentHashMap<>(); public static LoopContextHolder getCurrent(ProcessContext context, boolean forceCreate) { LoopContextHolder loopContextHolder = (LoopContextHolder)context.getVariable( DomainConstants.VAR_NAME_CURRENT_LOOP_CONTEXT_HOLDER); if (null == loopContextHolder && forceCreate) { - try (ResourceLock ignored = context.getLock().obtain()) { + try (ResourceLock ignored = LOCK_MAP.computeIfAbsent(context, k -> new ResourceLock()).obtain()) { loopContextHolder = (LoopContextHolder)context.getVariable( DomainConstants.VAR_NAME_CURRENT_LOOP_CONTEXT_HOLDER); if (null == loopContextHolder) { loopContextHolder = new LoopContextHolder(); context.setVariable(DomainConstants.VAR_NAME_CURRENT_LOOP_CONTEXT_HOLDER, loopContextHolder); } + } finally { + LOCK_MAP.remove(context); } } return loopContextHolder; diff --git a/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java b/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java index b8d588f9291..69b3762777d 100644 --- a/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java +++ b/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java @@ -16,8 +16,6 @@ */ package org.apache.seata.saga.proctrl; -import org.apache.seata.common.lock.ResourceLock; - import java.util.Map; /** @@ -97,9 +95,4 @@ public interface ProcessContext { */ T getInstruction(Class clazz); - /** - * Gets get lock. - * @return the lock of the current process context - */ - ResourceLock getLock(); }