有一个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可解决此问题。

09-08 02:28