2010-05-06 12 views
82

estaba leyendo el Javadoc para ThreadLocal aquí¿Por qué variables de Java ThreadLocal ser estática

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

y dice "instancias ThreadLocal son campos estáticos normalmente privadas en las clases que deseen asociarse estado con una rosca (por ejemplo, una identificación de usuario o una identificación de transacción). "

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

Respuesta

96

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.
Ninguna solicitud web => una sesión de persistencia por objeto.

+1

Me gusta esta explicación porque muestra cómo se debe utilizar ThreadLocal – kellyfj

+3

El subproceso por instancia puede ser una semántica útil, pero la mayoría de los usos para ese patrón implicarían tantos objetos que sería mejor usar un ' ThreadLocal' para mantener una referencia a un conjunto de hash que correlaciona objetos con instancias por subproceso. – supercat

+0

¡Buena explicación! – ADJ

3

La razón es que las variables se acceden 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.

9

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

13

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 mientras tenga ese singleton disponible globalmente.

0

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 hilos sin sincronizar el acceso al mismo como lo haría para un campo ordinario.

Cuestiones relacionadas