Principios y uso locales del hilo
En resumen, ThreadLocal es un método de espacio por tiempo, en el que cada hilo mantiene un ThreadLocal.ThreadLocalMap, que implementa un método de direccionamiento abierto para aislar datos, y los datos no serán *** *ed, por lo que no hay problemas de seguridad de subprocesos. Hilo local.
JDK1.2 proporciona java.lang.ThreadLocal. ThreadLocal proporciona una nueva forma de resolver problemas de concurrencia en programas multiproceso. Con esta clase de herramienta, puede escribir hermosos programas multiproceso de manera muy simple. ThreadLocal no es un hilo, sino una variable local del hilo.
ThreadLocal se utiliza para almacenar variables para que los subprocesos las compartan: para el mismo ThreadLocal estático, proporciona una copia independiente de la variable para cada subproceso que lo usa, y diferentes subprocesos solo pueden obtenerla de él. elimina sus propias variables, por lo que cada hilo puede cambiar independientemente su propia copia sin afectar las copias de otros hilos. Por lo tanto, cada hilo puede cambiar independientemente su propia copia sin afectar las copias de otros hilos. Desde la perspectiva del hilo, la variable de destino es como la variable local de un hilo, que es lo que significa "Local" en el nombre de la clase.
La interfaz de la clase ThreadLocal es muy simple, con solo cuatro métodos:
Cabe mencionar que en JDK5.0, ThreadLocal ya admite genéricos. En JDK5.0, ThreadLocal implementó genéricos y el nombre de la clase se cambió a ThreadLocallt;. Los métodos API también se han ajustado en consecuencia. La nueva versión de los métodos API son void set(T value), T get() y T initialValue().
¿Cómo mantiene ThreadLocal una copia de las variables para cada hilo? La idea es simple: hay un mapa en la clase ThreadLocal que almacena una copia de las variables de cada hilo. Las claves de los elementos en el Mapa son objetos de hilo y los valores corresponden a las copias de variables del hilo.
1? Threads **** puede disfrutar del almacenamiento en caché de variables, de la siguiente manera: Thread.ThreadLocalMaplt; ThreadLocal, Objectgt;
Cuando llamas a ThreadLocal.get(), en realidad El Lo anterior es obtener una copia de la variable del hilo actual. ThreadLocalMaplt; ThreadLocal, Objectgt;, luego disfrutamos del objeto variable basado en el hilo actual. ThreadLocal.set y ThreadLocal.remove son en realidad lo mismo.
2. Ventajas de esta estructura de almacenamiento:
3. Problemas con referencias débiles a ThreadLocalMaplt; ThreadLocal, Objectgt;:
Cuando el hilo no ha terminado pero ThreadLocal tiene ThreadLocal que se puede reciclar cuando se recicla. Si ThreadLocal se ha reciclado, puede producirse una pérdida de memoria debido a la presencia de ThreadLocalMaplt null, Objectgt; (Después de reciclar ThreadLocal, la variable de disfrute de subprocesos relacionada con ThreadLocal todavía existe).
Aunque el método get/set de ThreadLocal puede borrar el valor con una clave nula en ThreadLocalMap, el método get/set no necesariamente se llamará después de una pérdida de memoria, por lo que existen dos métodos para evitar esto. que suceda:
Los resultados son los siguientes.