Lesen Sie zuerst den folgenden Spring MVC-Controller
@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);
}
}
Dieser Controller merkt sich, wie oft auf ihn zugegriffen wurde, und gibt aus, wie oft auf ihn zugegriffen wurde. Wenn Sie 100.000 Mal ** einmal ** auf den Controller zugreifen, können 100.000 korrekt ausgegeben werden.
Aber der Controller ist furchtbar problematisch. Wenn ** 100 Benutzer gleichzeitig auf 1000 zugreifen **, ist die letzte Ausgabe nicht 100.000.
Java Servlet ist eine Multithread-Umgebung, dh eine Umgebung, die eine große Anzahl von Anforderungen gleichzeitig verarbeiten kann. Spring MVC basiert auf Java Servlet. Das Design der Java-Servlet-Klasse muss Multithread-bewusst sein.
Einfach ausgedrückt besteht das Problem darin, dass die Klassenvariable * count * nicht threadsicher ist. Das Problem kann gelöst werden, indem der Controller wie unten gezeigt neu geschrieben wird.
@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