2012-05-15 20 views
5

definió una variable hilocal en una clase para mantener algunas instancias. establecer y obtener un método recursivo. De alguna manera, no puedo borrar la variable threadlocal cuando la solicitud se completa (lo he analizado de todas las otras formas. No puedo borrar threadlocal).Si no se borra la variable ThreadLocal, ¿qué pasará?

Mi pregunta es, si no eliminé la variable threadlocal para cada solicitud, ¿qué pasará? ¿Cuáles son los impactos?

Respuesta

2

Si el hilo muere, también lo hace la referencia a la entrada ThreadLocal y su objeto (suponiendo que no haya otras referencias) será recogido.

Mientras el hilo viva, también lo hará su objeto.

Tiene que evaluar cuál es el impacto de que su objeto sea de larga duración.

+0

Gracias bohemian for ur response. Entonces, al servir una próxima solicitud, no obtendré los valores anteriores de threadlocal (de solicitud previa) .. ¿rito? – Shahul

+0

sí, creo que lo hará, ya que los servidores tienden a reutilizar los hilos. – keuleJ

0

Tiene una pérdida de memoria y es posible que ThreadLocal ya esté configurado la próxima vez que se llame al código. ThreadLocals es un poco un olor de código imo.

9

el Javadoc dice:

después de un hilo desaparece, todas sus copias de las instancias de subproceso local están sujetos a la recolección de basura (a menos que existan otras referencias a estos copias).

Por ejemplo, the implementation aquí está respaldado por una tabla hash que utiliza weak references para la clave. En este caso, la clave es el hilo. Si el hilo termina, la entrada en el mapa es elegible para la recolección de basura.

La recolección de basura puede ocurrir solo cuando el sistema comienza a quedarse sin espacio en la memoria. Pero esta consideración se aplica a todos los objetos del sistema: cuando los objetos comienzan a recuperarse dependen de la política de GC, que es específica de VM y está sujeta a ajustes.

Este es mi punto de vista del bien y el mal uso de los locales de rosca:

  • Se es bueno locales uso de hilo OT Si el punto es hacer frente a un problema de concurrencia. Por ejemplo, evitando la sincronización de an object that is not thread-safe by keeping one copy per thread. O para abordar otro problema de diseño relacionado con la concurrencia.

  • Es es malo si el punto es "pasar un parámetro" en la cadena de llamadas de una manera económica. Debería refactorizar mejor su código y pasar el objeto por la cadena de llamadas como un parámetro de método regular.

  • Es está bien para usar el hilo local para almacenar algún tipo de contexto "actual", p. Ej. la solicitud actual.

Cuestiones relacionadas