patrones de diseño de programación concurrentes --ThreadLocal hilo modo de almacenamiento local

Su esencia es evitar el ThreadLocal Compartir

Como se suele decir que no hay intercambio, no hay ningún daño. Vamos a echar un vistazo a la fuente ThreadLocal, clase Thread contiene una variable threadLocals, es un tipo ThreadLocal.ThreadLocalMap que se define en la clase ThreadLocal allí, que es una clase interna. Y eso es ThreadLocalMap Este céntrico clase implementa una clase de estructura de mapa también contiene la clase interna de entrada y valores de las variables de los objetos ThreadLocal, están reservados por la entrada.

¿Cómo lograr la simulación

En la comprensión de la función de ThreadLocal Tratamos de pensar en una pregunta: ¿Cómo es ThreadLocal para lograrlo, y la forma de variables de enlace entre los hilos de la misma? De hecho, si nos dejamos alcanzar la función ThreadLocal, siempre que podemos conseguir esta funcionalidad a través de una estructura de mapa. Mapa de donde la clave es el hilo actual, y mapa de valor es el valor de la variable. La siguiente figura muestra ThreadLocal diseñan ideas.

La clase de análogos ofrece tres métodos conjunto, llegar y quitar, estos tres métodos son operativo indirecta Mapa objeto. valores clave nota objeto del mapa son el hilo actual para adquirir la Thread.currentThread (), esta necesidad valor clave no ser aprobada por la persona que llama. Esta realización de un simple ThreadLocal, no es muy simple?

 

 

El siguiente es un diseño de Java

 

 

 

 

 

Se puede simplificar a la siguiente descripción de la figura.

 

 

Diseñamos e implementación de Java simplemente es diferente Mapa de los titulares, nuestro diseño interior Mapa pertenecen ThreadLocal, y las implementaciones de Java, que ThreadLocalMap es parte de hilo. ¿Cuál de estos dos métodos es más razonable? Está claro que la realización de Java es más razonable. En las implementaciones de Java en el interior, ThreadLocal es sólo una herramienta de proxy, interna no posee datos en relación con el hilo y el hilo de todos los datos relevantes se almacena en el interior del hilo, este diseño es fácil de entender. A partir de los datos en términos de afinidad, ThreadLocalMap perteneciente rosca también más razonable.

 Por supuesto, hay una razón más profundamente arraigada, que es no es propenso a pérdidas de memoria . En nuestro esquema de diseño, ThreadLocal celebró Mapa llevará a cabo referencia de objeto hilo, lo que significa que, mientras exista el objeto ThreadLocal, entonces nunca se recuperó el objeto Thread mapa. ThreadLocal ciclo de vida es a menudo más largo que el hilo, por lo que este diseño puede fácilmente conducir a pérdidas de memoria. La aplicación Java Tema ThreadLocalMap espera y ThreadLocalMap en referencias al ThreadLocal o débil (WeakReference), siempre y cuando los objetos de Temas pueden ser reciclados, por lo ThreadLocalMap pueden ser reciclados. Esta implementación de Java Aunque parece complicado, pero más seguro.

, Seguimos compartiendo el código fuente:

métodos set ThreadLocal

En primer lugar obtener el objeto hilo actual, y luego obtener el subproceso actual getMap método ThreadLocalMap, de hecho, obtenida del objeto Thread, y finalmente llamamos al conjunto de objetos de ThreadLocalMap método para salvar clave-valor. Nota Si ThreadLocalMap objetos objeto Thread está vacía, entonces es necesario llamar al método createMap para crear ThreadLocalMap objeto y el objeto Thread asociado.

 

 

 

ThreadLocal obtener métodos

En primer lugar obtener el objeto hilo actual, y luego llegar ThreadLocalMap hilo actual por el método getMap, si el objeto no está vacía, entonces llamar ThreadLocalMap método de objeto de conseguir getEntry entrada, la entrada contiene un valor que es el objeto que queremos. Si la adquisición es menor que el valor del método setInitialValue será ejecutado final, que se utiliza para establecer el valor inicial del procedimiento de acuerdo con objeto initialValue ThreadLocal, el valor predeterminado es nulo, si desea establecer un valor inicial puede ser método reemplazado initialValue

 

 

 

 

método remove ThreadLocal

método Lógica remove es el acceso simple, directo al objeto de destino ThreadLocalMap hilo actual, y luego llamar al método remove para eliminar el objeto correspondiente a la clave-valor.

 

 

Tenga en cuenta las pérdidas de memoria cuando se utiliza con ThreadLocal

¿Por qué utilizar agrupación de hebras ThreadLocal puede causar fugas de una memoria que? La razón radica en el tiempo de supervivencia de un hilo de la agrupación de hebras es demasiado largo, ya menudo el programa con la muerte total, lo que significa hilo ha ocupado ThreadLocalMap no será recuperado, además ThreadLocalMap de entrada en ThreadLocal se referencia débil (WeakReference), una débil tipos de referencia serán reciclados en ausencia de otras referencias fuertes en el caso del recolector de basura JVM, siempre y cuando ThreadLocal final de su ciclo de vida se puede reciclar a cabo. Sin embargo, en la entrada de valor citada entrada es fuerte, por lo que incluso si el final del ciclo de vida de Valor, Valor tampoco se puede reciclar, lo que resulta en una pérdida de memoria.

 En ese grupo de subprocesos, que ThreadLocal cómo usarlo correctamente? Realmente muy simple, ya que no se puede hacer automáticamente el aparato referencia fuerte JVM para el valor, entonces seremos capaces de liberar manualmente, mirada en el uso de Java en la clase ThreadLocal. remove Eventualmente () método.

 

 

try {} finally {} programas , la solución más eficaz, por lo general podemos aprender.

 

Referencia: https://www.jianshu.com/p/812555ba4194

 

Supongo que te gusta

Origin www.cnblogs.com/amberJava/p/12452694.html
Recomendado
Clasificación