Java ThreadLocal static?
jakarta-ee, java, multithreading, thread-local
Solution
As per the definition of ThreadLocal class
This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).
That means say 2 threads `t1` & `t2` executes `someBMethod()` and they end up setting `x1` & `x2`(Instances of `X`) respectively. Now when `t1` comes and executes `someCMethod()` it gets `x1` (which is set by itself earlier) and `t2` gets `x2`.
In other words, its safe to have a single static instance of `ThreadLocal`, because internally it does something like this when you invoke `set`
set(currentThread, value) //setting value against that particular thread
and when you invoke get
get(currentThread) //getting value for the thread
Problem
Setting a value in Thread Local: ``` //Class A holds the static ThreadLocal variable. Class A{ public static ThreadLocal<X> myThreadLocal = new ThreadLocal<X>(); .... } //A Class B method sets value in A's static ThreadLocal variable class B{ { public void someBmethod(){ X x = new X(); A.myThreadLocal.set(x); } } //Class C retrieves the value set in A's Thread Local variable. Class C { public void someCMethod(){ X x = A.myThreadLocal.get(); } ... } ``` Quesiton: Now assuming this is a web-application, and threads execute: B.someBMethod, C.someCMethod in that order. Multiple threads executing B's someBMethod, will end up updating the SAME A's static ThreadLocal variable myThreadLocal, thereby beating the very purpose of ThreadLocal variable. (Using static for ThreadLocal is what is recommended as per documentation.) The C's someCMethod, while retrieving value from ThreadLocal may not get the value set by the 'current' thread. What am i missing here?