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.