Solución de problema de valor de cadena ThreadLocal de un solo hilo de Java

ThreadLocal

ThreadLocal es adecuado para escenarios donde las variables están aisladas entre subprocesos y compartidas entre métodos o clases.

Código

@RestController
public class ThreadLocalController {
  private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null);
  @GetMapping("bad")
  public Map doBad(@RequestParam("uid") String uid) {
    String before = currentUid.get();
    currentUid.set(uid);
    String after = currentUid.get();
    Map result = new HashMap();
    result.put("before", before);
    result.put("after", after);
    return result;
  }
}

Hacer la configuración de tomcat en la aplicación

server.tomcat.max-threads = 1

Ejecute los resultados por primera vez

la segunda vez

Es lógico que antes sea siempre nulo. ¿Por qué se lee el valor de la primera vez en la segunda ejecución?

Solo porque nuestro tocat iniciará un subproceso para llamar a nuestro programa, y ​​el propio tomcat tiene un grupo de subprocesos, habrá reutilización de subprocesos. Entonces causó un problema.

reparar

@RestController
public class ThreadLocalController {
  private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null);
  @GetMapping("good")
  public Map doGood(@RequestParam("uid") String uid) {

    try {
      String before = currentUid.get();
      currentUid.set(uid);
      String after = currentUid.get();
      Map result = new HashMap();
      result.put("before", before);
      result.put("after", after);
      return result;
    } finally {
      currentUid.remove();
    }
  }
}

Clave

grupo de subprocesos tomcat.

Algunas preguntas de entrevistas de alta frecuencia recopiladas en el último 2020 (todas organizadas en documentos), hay muchos productos secos, incluidos mysql, netty, spring, thread, spring cloud, jvm, código fuente, algoritmo y otras explicaciones detalladas, así como planes de aprendizaje detallados, entrevistas Clasificación de preguntas, etc. Para aquellos que necesitan obtener estos contenidos, agregue Q como: 11604713672

Supongo que te gusta

Origin blog.csdn.net/weixin_51495453/article/details/113882314
Recomendado
Clasificación