计算Tomcat / Spring Boot上的传入/传出线程 - 错过计数

时间:2017-09-18 21:55:09

标签: java spring multithreading spring-mvc tomcat

有一个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。

这已成为总体故障排除尝试的一部分。

1 个答案:

答案 0 :(得分:0)

看起来整数不能安全递增或递减,因为这是Is a volatile int in Java thread-safe?

的读/修改/写周期

将整数更改为AtomicIntegers解决了这个问题。