有一个Spring Boot应用程序,它公开以下Rest端点
private static int requestsIn=0;
private static int requestsOut=0;
@RequestMapping(value = "/endpoint", method = RequestMethod.POST, consumes = "application/json")
public Long insertPojo(@RequestBody final Pojo pojo) {
requestsIn++;
final long startTime= System.currentTimeMillis();
service.doSomething(pojo);
final long endtime = System.currentTimeMillis();
requestsOut++;
LOG.info("requestsIn = {}, requestsOut={}",requestsIn,requestsOut);
return (endtime - startTime);
}
然后我有一个产生50个线程的客户端(通过Spring ThreadPoolExecuter)并命中该端点。
我希望端点打印的最终日志最终会是 requestsIn = RequestsOut = 50 ,但我通常会看到requestsOut = 50和requestsIn = 40-49。
有人可以解释为什么会发生这种情况吗?
我尝试在记录变量之前使计数器变量volitile甚至添加延迟(Thread.sleep),但是我无法将所有变量都等于50。
这已成为总体故障排除尝试的一部分。
答案 0 :(得分:0)
看起来整数不能安全递增或递减,因为这是Is a volatile int in Java thread-safe?
的读/修改/写周期将整数更改为AtomicIntegers解决了这个问题。