The documentation says it very well: "each thread that accesses [a thread-local variable] (via its get or set method) has its own, independently initialized copy of the variable". You use one when each thread must have its own copy of something. By default, data is shared between threads.