threadlocal ejemplo java multithreading

ejemplo - ¿Por qué las variables de Java ThreadLocal deberían ser estáticas?



threadlocal java 8 (5)

La razón es que se accede a las variables a través de un puntero asociado con el hilo. Actúan como variables globales con alcance de subproceso, por lo tanto, la estática es la más adecuada. Esta es la manera en que obtienes el estado local del subproceso en cosas como pthreads, por lo que esto podría ser solo un accidente de historial e implementación.

Estaba leyendo el JavaDoc para Threadlocal aquí

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html

y dice "Las instancias de ThreadLocal son típicamente campos privados y estáticos en las clases que desean asociar el estado con un hilo (por ejemplo, un ID de usuario o ID de transacción)".

Pero mi pregunta es por qué eligieron hacerlo estático (típicamente) - hace que las cosas sean un poco confusas para tener el estado "por hilo" pero los campos son estáticos.


No tiene que ser así. Lo importante es que debería ser un singleton.


Porque si se tratara de un campo de nivel de instancia, en realidad sería "Per Thread - Per Instance", no solo un "Per Thread" garantizado. Esa no es normalmente la semántica que estás buscando.

Por lo general, contiene algo así como objetos que tienen como ámbito una conversación de usuario, solicitud web, etc. No desea que también se subclasifiquen a la instancia de la clase.
Una solicitud web => una sesión de persistencia.
No hay una solicitud web => una sesión de persistencia por objeto.


Un uso para un threadlocal en una instancia por subproceso es si desea que algo sea visible en todos los métodos de un objeto y tenerlo seguro para subprocesos sin sincronizar el acceso al mismo como lo haría para un campo ordinario.


Ya sea que sea estático o si está tratando de evitar cualquier campo estático en su clase: haga que la clase en sí misma sea singleton y luego puede usar el nivel de instancia ThreadLocal de forma segura siempre que tenga ese singleton disponible globalmente.