¡No usará Java ThreadLocal para quedarse atrás!

La clase ThreadLocal en Java nos permite crear variables que solo pueden ser leídas y escritas por el mismo hilo. Por lo tanto, si un fragmento de código contiene una referencia a una variable ThreadLocal, incluso si dos subprocesos ejecutan este fragmento de código al mismo tiempo, no pueden acceder a la variable ThreadLocal del otro.

Cómo crear variables ThreadLocal

El siguiente código muestra cómo crear una variable ThreadLocal:

private ThreadLocal myThreadLocal = new ThreadLocal();

Podemos ver que se crea una instancia de un objeto ThreadLocal a través de este código. Solo necesitamos crear una instancia del objeto una vez, y no necesitamos saber por qué hilo se creó la instancia. Aunque todos los subprocesos pueden acceder a esta instancia de ThreadLocal, cada subproceso solo puede acceder al valor establecido llamando al método set () de ThreadLocal. Incluso si dos subprocesos diferentes establecen valores diferentes en el mismo objeto ThreadLocal, todavía no pueden acceder a los valores del otro.

Cómo acceder a las variables ThreadLocal

Una vez que se crea una variable ThreadLocal, puede establecer un valor que debe guardarse con el siguiente código:

myThreadLocal.set("A thread local value”);

El valor almacenado en la variable ThreadLocal se puede leer mediante el siguiente método:

String threadLocalValue = (String) myThreadLocal.get();

El método get () devuelve un objeto Object, y el objeto set () necesita pasar un parámetro de tipo de objeto.

Especificar un tipo genérico para ThreadLocal

Podemos crear un objeto ThreadLocal que especifique el tipo genérico, de modo que no necesitemos convertir el valor devuelto por el método get () cada vez. A continuación, se muestra un ejemplo de ThreadLocal que especifica un tipo genérico:

private ThreadLocal myThreadLocal = new ThreadLocal<String>();

Ahora solo podemos almacenar valores de tipo String en el objeto ThreadLocal.

Y cuando obtenemos el valor de ThreadLocal, no es necesario lanzar.

Cómo inicializar el valor de la variable ThreadLocal

Dado que solo se puede acceder al valor establecido en el objeto ThreadLocal mediante el subproceso que establece el valor, el subproceso no puede usar el método set () en el objeto ThreadLocal para guardar un valor inicial, y todos los subprocesos pueden acceder a este valor inicial.

Pero podemos especificar un valor inicial para un objeto ThreadLocal creando una subclase de ThreadLocal y anulando el método initialValue (). Como se muestra en el siguiente código:

private ThreadLocal myThreadLocal = new ThreadLocal<String>() {

    @Override
    protected String initialValue() {
        return "This is the initial value";
    }

};

Un ejemplo completo de ThreadLocal

El siguiente es un ejemplo ejecutable completo de ThreadLocal:

public class ThreadLocalExample {

    public static class MyRunnable implements Runnable {

        private ThreadLocal threadLocal = new ThreadLocal();

        @Override
        public void run() {
            threadLocal.set((int) (Math.random() * 100D));
            try {
            Thread.sleep(2000);
            } catch (InterruptedException e) {

            }
            System.out.println(threadLocal.get());
        }
    }

    public static void main(String[] args) {
         MyRunnable sharedRunnableInstance = new MyRunnable();
         Thread thread1 = new Thread(sharedRunnableInstance);
         Thread thread2 = new Thread(sharedRunnableInstance);
         thread1.start();
         thread2.start();
    }

}

El ejemplo anterior crea una instancia de MyRunnable y pasa la instancia como parámetro a dos subprocesos. Los dos subprocesos ejecutan el método run () por separado y ambos guardan valores diferentes en la instancia de ThreadLocal. Si no están accediendo a los objetos ThreadLocal y el método set () al que llaman está sincronizado, el segundo hilo sobrescribirá el valor establecido por el primer hilo. Sin embargo, debido a que están accediendo a un objeto ThreadLocal, ninguno de los hilos puede ver el valor guardado por el otro. En otras palabras, acceden a dos valores diferentes.

Acerca de InheritableThreadLocal

La clase InheritableThreadLocal es una subclase de la clase ThreadLocal. Cada hilo de ThreadLocal tiene su propio valor. A diferencia de ThreadLocal, InheritableThreadLocal permite que un hilo y todos los hilos secundarios creados por el hilo accedan a su valor guardado.

Al final

Responda a los datos mediante un mensaje privado para recibir un resumen de las preguntas de la entrevista de Java de un fabricante importante + manual de Alibaba Taishan + una guía de aprendizaje para los puntos de conocimiento + un resumen de los puntos de conocimiento básicos de Java en un documento pdf de 300 páginas.

El contenido de estos materiales son todos los puntos de conocimiento que el entrevistador debe preguntar durante la entrevista. El capítulo incluye muchos puntos de conocimiento, incluidos conocimientos básicos, colecciones de Java, JVM, concurrencia multiproceso, principios de primavera, microservicios, Netty y RPC, Kafka , Diario, patrón de diseño, algoritmo Java, base de datos, Zookeeper, caché distribuida, estructura de datos, etc. expediente

Supongo que te gusta

Origin blog.csdn.net/weixin_46577306/article/details/108156919
Recomendado
Clasificación