También me confundí por qué necesito ThreadLocal cuando puedo usar variables locales, ya que ambas mantienen su estado dentro de un hilo. Pero después de mucha búsqueda y experimentación, veo por qué es necesario ThreadLocal.
encontré dos usos hasta ahora -
valores específicos hilo
- de verano en el interior del mismo objeto compartido
- Alternativa a pasar variables como parámetros a través de N-capas de código
1:
Si tiene dos hilos que operan en el mismo objeto y ambos hilos modifican este objeto - entonces ambos hilos siguen perdiendo sus modificaciones el uno al otro.
Para hacer que este objeto tenga dos estados separados para cada hilo, declaramos este objeto o parte de él ThreadLocal.
Por supuesto, ThreadLocal solo es beneficioso aquí porque ambos hilos comparten el mismo objeto. Si están utilizando diferentes objetos, no es necesario que los objetos sean ThreadLocal.
2:
El segundo beneficio de ThreadLocal, parece ser un efecto secundario de la forma de su ejecución.
Una variable ThreadLocal puede ser .set() por un hilo, y luego ser .get() en cualquier parte else. .get() recuperará el mismo valor que este subproceso había establecido en cualquier otro lugar. Necesitaremos un contenedor global disponible para hacer un .get() y .set(), para realmente escribir el código.
Cuando hacemos un threadLocalVar.set() - es como si estuviera dentro de un "mapa" global, donde este es la clave.
Como si - someGlobalMap.put (Thread.currentThread(), threadLocalVar);
Así que diez capas hacia abajo, cuando hacemos threadLocalVar.get() - obtenemos el valor que este hilo había establecido diez capas.
threadLocalVar = someGlobalMap.get (Thread.currentThread());
Por lo tanto, la función en décimo nivel no tiene que arrastrarse alrededor de esta variable como parámetro, y puede acceder a ella con .get() sin preocuparse por si es del hilo correcto.
Por último, dado que una variable ThreadLocal es una copia para cada hilo, por supuesto, no necesita sincronización. He entendido mal a ThreadLocal anteriormente como una alternativa a la sincronización, que no lo es. Es solo un efecto secundario de eso, que no necesitamos sincronizar la actividad de esta variable ahora.
Espero que esto haya ayudado.
Si está interesado únicamente en el rendimiento de ThreadLocal frente a las variables locales, esta pregunta tiene mucha lectura: http://stackoverflow.com/questions/609826/performance-of-threadlocal-variable – Alex