2012-06-25 17 views
6

Acabo de enterarme acerca de ThreadLocal esta mañana. He leído que siempre debe ser final y estática como:Confundido sobre ThreadLocal

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 

(Session es una sesión de Hibernate)

Mi confusión es la siguiente: Debido a que es estática, está disponible para cualquier tema en la JVM. Sin embargo, ¿almacenará información local para cada hilo que acceda a ella? Estoy tratando de entender esto, así que me disculpo si esto no está claro. Cada subproceso de la aplicación tiene acceso al mismo objeto ThreadLocal, pero el objeto ThreadLocal almacenará los objetos locales en cada subproceso.

+3

Tenga cuidado con el uso de esto en aplicaciones web implementadas en un entorno compartido. El hilo local se filtrará en todos los contextos y después de su desinstalación las referencias en el hilo local no serán basura. Debe eliminar los datos después de cada solicitud de forma manual. – jontro

+0

Es aparentemente contradictorio. Se supone que 'ThreadLocal' es único en cada hilo, pero los objetos estáticos se comparten entre cada hilo. Estaba a punto de hacer la misma pregunta. – aliteralmind

Respuesta

10

Sí, la instancia sería la misma, pero el código adjunta el valor que estableció con Thread.currentThread(), cuando lo establece y cuando lo recupera, por lo que el valor establecido será accesible solo dentro del subproceso actual cuando se acceda usando los métodos set y get.

Es muy fácil de entender.

Imagine que cada Thread tiene un mapa que asocia un valor a una instancia de ThreadLocal. Cada vez que realiza un get o un conjunto en un ThreadLocal, la implementación de ThreadLocal obtiene el mapa asociado al actual Thread (Thread.currentThread()) y realiza el get o set en ese mapa usándose a sí mismo como clave.

Ejemplo:

ThreadLocal tl = new ThreadLocal(); 
tl.set(new Object()); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.put(tl, [object you gave]) 

Object obj = t1.get(); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.get(tl) 

Y lo interesante de esto es que el ThreadLocal es jerárquica, es decir, si ha definido un valor para un padre Thread será accesible desde un niño de un.

+0

Gracias, esto ayuda mucho. – badgerduke

+0

¡De nada! –

+0

Dice que imagine que hay un mapa en el 'ThreadLocal'. Entiendo el concepto La identificación del hilo es la clave, las instancias únicas son los valores. Entonces, el objeto 'ThreadLocal' en general es estático y tiene un valor por hilo. ¿Está realmente implementado con un mapa interno? – aliteralmind

2

Siempre accede a la misma instancia de ThreadLocal para un problema específico pero esta instancia devuelve un valor diferente para cada hilo llamando al método get.

Ese es el punto: es fácil encontrar el objeto, pero cada hilo tendrá su propio valor específico. Por lo tanto, puede, por ejemplo, asegurarse de que dos subprocesos diferentes no accedan a su valor específico.

Se puede ver (conceptualmente) como un tipo de HashMap<Thread><V> al que siempre se accederá con Thread.currentThread() como clave.

+0

¡Gracias por su respuesta! – badgerduke

2

Porque los valores específicos de subprocesos no se almacenan en el objeto ThreadLocal, pero el current Thread 'ThreadLocalMap. El objeto ThreadLocal simplemente sirve como clave en estos mapas.

Para obtener más información, lea JavaDoc de ThreadLocal y subclases, o, si tiene curiosidad acerca de la implementación, el código fuente disponible en cada JDKs src.zip reciente.

+0

¡Gracias, esto ayudó! – badgerduke

Cuestiones relacionadas