diff options
Diffstat (limited to 'kamon-core/src/main/scala/kamon/context/Storage.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/context/Storage.scala | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/kamon-core/src/main/scala/kamon/context/Storage.scala b/kamon-core/src/main/scala/kamon/context/Storage.scala index 7bbca111..2b409592 100644 --- a/kamon-core/src/main/scala/kamon/context/Storage.scala +++ b/kamon-core/src/main/scala/kamon/context/Storage.scala @@ -27,23 +27,36 @@ object Storage { def close(): Unit } - + /** + * Wrapper that implements optimized {@link ThreadLocal} access pattern ideal for heavily used + * ThreadLocals. + * + * <p> It is faster to use a mutable holder object and always perform ThreadLocal.get() and never use + * ThreadLocal.set(), because the value is more likely to be found in the ThreadLocalMap direct hash + * slot and avoid the slow path ThreadLocalMap.getEntryAfterMiss(). + * + * <p> Credit to @trask from the FastThreadLocal in glowroot. + * + * <p> One small change is that we don't use an kamon-defined holder object as that would prevent class unloading. + * + * */ class ThreadLocal extends Storage { - private val tls = new java.lang.ThreadLocal[Context]() { - override def initialValue(): Context = Context.Empty + private val tls = new java.lang.ThreadLocal[Array[AnyRef]]() { + override def initialValue(): Array[AnyRef] = + Array(Context.Empty) } override def current(): Context = - tls.get() + tls.get()(0).asInstanceOf[Context] - override def store(context: Context): Scope = { - val newContext = context - val previousContext = tls.get() - tls.set(newContext) + override def store(newContext: Context): Scope = { + val ref = tls.get() + val previousContext = ref(0) + ref(0) = newContext new Scope { override def context: Context = newContext - override def close(): Unit = tls.set(previousContext) + override def close(): Unit = ref(0) = previousContext } } } @@ -51,4 +64,4 @@ object Storage { object ThreadLocal { def apply(): ThreadLocal = new ThreadLocal() } -}
\ No newline at end of file +} |