Lisez d'abord le contrôleur Spring MVC ci-dessous
@Controller
@RequestMapping("/count")
public class CountController {
private long count = 0;
@GetMapping(value = "/increment", produces = "text/plain")
@ResponseBody
public String increment() {
count++;
return Long.toString(count);
}
}
Ce contrôleur se souvient du nombre de fois où il est accédé et affiche le nombre de fois où il est accédé. Si vous accédez au contrôleur 100 000 fois ** une fois **, 100 000 peuvent être correctement émis.
Mais le contrôleur est terriblement problématique. Si ** 100 utilisateurs accèdent en même temps **, 1 000 fois, le dernier résultat n'est pas 100 000.
Java Servlet est un environnement multi-thread, c'est-à-dire un environnement capable de traiter un grand nombre de requêtes en même temps. Spring MVC est construit sur Java Servlet. La conception de la classe Java Servlet doit être compatible avec le multithread.
En termes simples, le problème est que la variable de classe * count * n'est pas thread-safe. Le problème peut être résolu en réécrivant le contrôleur comme indiqué ci-dessous.
@Controller
@RequestMapping("/count")
public class CountController {
private AtomicLong count = new AtomicLong(0l);
@GetMapping(value = "/increment", produces = "text/plain")
@ResponseBody
public String increment() {
return Long.toString(count.addAndGet(1l));
}
}
Recommended Posts