diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2018-10-13 16:11:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-13 16:11:35 +0200 |
commit | aad6a8ba785622780c3632293bbeb0823a9f0249 (patch) | |
tree | 6feab2dce1fbab244395724b3ef5e8db77f2832b /kamon-core/src/main | |
parent | 36b64d0ece9e69dde6ff1b53042b884dfd94e5d2 (diff) | |
parent | b5ba5c442e8cb4b0818cf5ba317654cb7d0ff8dd (diff) | |
download | Kamon-aad6a8ba785622780c3632293bbeb0823a9f0249.tar.gz Kamon-aad6a8ba785622780c3632293bbeb0823a9f0249.tar.bz2 Kamon-aad6a8ba785622780c3632293bbeb0823a9f0249.zip |
Merge pull request #553 from kamon-io/thread-local-improvements
Improvements in ThreadLocalStorage
Diffstat (limited to 'kamon-core/src/main')
-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 +} |