有一个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);
}
然后,我有一个客户端(通过Spring ThreadPoolExecuter生成了50个线程)并命中了该端点。
我希望端点将最终打印的最终日志最终是requestsIn = RequestsOut = 50,但是我通常会看到requestsOut = 50和requestIn = 40-49。
谁能解释为什么会发生这种情况?
我试图使计数器变量易变,甚至在记录变量之前添加一个delay(Thread.sleep),但是我无法使所有变量都等于50。
这是总体故障排除尝试的一部分。
最佳答案
看来整数不能安全地递增或递减,因为这是根据Is a volatile int in Java thread-safe?的读/修改/写周期
将整数更改为AtomicIntegers可解决此问题。