How much is read from ThreadLocal
variable slower than from regular field?
More concretely is simple object creation faster or slower than access to ThreadLocal
variable?
I assume that it is fast enough so that having ThreadLocal<MessageDigest>
instance is much faster then creating instance of MessageDigest
every time. But does that also apply for byte[10] or byte[1000] for example?
Edit: Question is what is really going on when calling ThreadLocal
's get? If that is just a field, like any other, then answer would be "it's always fastest", right?
Summary. A thread local is around 10-20x that of the heap read.
It enables you to create variables that can only be read and write by the same thread. If two threads are executing the same code and that code has a reference to a ThreadLocal variable then the two threads can't see the local variable of each other.
ThreadLocal is useful, when you want to have some state that should not be shared amongst different threads, but it should be accessible from each thread during its whole lifetime. As an example, imagine a web application, where each request is served by a different thread.
You should always call remove because ThreadLocal class puts values from the Thread Class defined by ThreadLocal. Values localValues; This will also cause to hold reference of Thread and associated objects. the value will be set to null and the underlying entry will still be present.
In 2009, some JVMs implemented ThreadLocal
using an unsynchronised HashMap
in the Thread.currentThread()
object. This made it extremely fast (though not nearly as fast as using a regular field access, of course), as well as ensuring that the ThreadLocal
object got tidied up when the Thread
died. Updating this answer in 2016, it seems most (all?) newer JVMs use a ThreadLocalMap
with linear probing. I am uncertain about the performance of those – but I cannot imagine it is significantly worse than the earlier implementation.
Of course, new Object()
is also very fast these days, and the garbage collectors are also very good at reclaiming short-lived objects.
Unless you are certain that object creation is going to be expensive, or you need to persist some state on a thread by thread basis, you are better off going for the simpler allocate when needed solution, and only switching over to a ThreadLocal
implementation when a profiler tells you that you need to.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With