From 535878054313d94e00f81c6a647bac2f92559207 Mon Sep 17 00:00:00 2001 From: zhangwei <26432832+Arugal@users.noreply.github.com> Date: Mon, 17 Jun 2019 16:34:35 +0800 Subject: [PATCH] TracingContext optimize (#2884) * TracingContext optimize * fix checkstyle --- .../agent/core/context/TracingContext.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java index 7739073395..f9b8dd631a 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java @@ -72,9 +72,9 @@ public class TracingContext implements AbstractTracerContext { /** * The counter indicates */ - private AtomicInteger asyncSpanCounter; + private volatile AtomicInteger asyncSpanCounter; private volatile boolean isRunningInAsyncMode; - private ReentrantLock asyncFinishLock; + private volatile ReentrantLock asyncFinishLock; /** * Initialize all fields with default value. @@ -82,12 +82,8 @@ public class TracingContext implements AbstractTracerContext { TracingContext() { this.segment = new TraceSegment(); this.spanIdGenerator = 0; - if (samplingService == null) { - samplingService = ServiceManager.INSTANCE.findService(SamplingService.class); - } - asyncSpanCounter = new AtomicInteger(0); + samplingService = ServiceManager.INSTANCE.findService(SamplingService.class); isRunningInAsyncMode = false; - asyncFinishLock = new ReentrantLock(); } /** @@ -414,7 +410,15 @@ public class TracingContext implements AbstractTracerContext { } @Override public AbstractTracerContext awaitFinishAsync() { - isRunningInAsyncMode = true; + if (!isRunningInAsyncMode) { + synchronized (this) { + if (!isRunningInAsyncMode) { + asyncFinishLock = new ReentrantLock(); + asyncSpanCounter = new AtomicInteger(0); + isRunningInAsyncMode = true; + } + } + } asyncSpanCounter.addAndGet(1); return this; } @@ -432,7 +436,7 @@ public class TracingContext implements AbstractTracerContext { asyncFinishLock.lock(); } try { - if (activeSpanStack.isEmpty() && asyncSpanCounter.get() == 0) { + if (activeSpanStack.isEmpty() && (!isRunningInAsyncMode || asyncSpanCounter.get() == 0)) { return true; } } finally { -- GitLab