我们的生产箱上发生了一件奇怪的事情。代码功能:UI servlet 对用户正在操作的文档对象进行监视器锁定并对其执行一些计算。获取监控锁是为了防止同一个文档对象同时被多个用户同时修改。
Prod 中观察到的问题:很少有用户操作超时。
日志分析:超时用户操作对应的线程在获取文档对象上的监控锁之前正在打印所有日志。然后有一个超过 1 小时的间隙,线程没有在日志中浮出水面,然后它突然变得活跃并进行计算并尝试发回一个响应,该响应显然是错误的,因为 HTTP 请求已经超时。我们检查了日志和代码,可以确认没有其他线程获得了对该特定文档对象的监控锁。所以锁在有问题的地方是没有争议的。
可能的问题是什么?是否只是线程在遇到同步块时进入可运行状态,并且在接下来的 60-80 分钟内,CPU 从来没有机会运行这个特定的可运行线程?