ThreadLocal class provides thread-local variables. Each thread
accesses only its own local variables. It has its own copy of the
variable.
By using ThreadLocal, if thread X stores a variable with value x
and another thread Y stores same variable with the value y, then X
gets x from its ThreadLocal instance and Y gets y from its
ThreadLocal instance.
Typically, ThreadLocal instances are private static fields that are
associated with the state of a thread