Singleton Bean中可能的竞争条件

时间:2019-05-10 21:14:32

标签: java spring spring-boot race-condition

我遇到了从第三方库调用的Spring bean中似乎存在的竞争状况,并且我试图确定我的实现是否存在问题,或者该问题可能与第三方有关库

@Override
public InputObject addMessageToInput(InputObject input) {

    List<String> messages = doStuff();

    log.debug("Messages are {}", messages);//messages appear to be correct at this point

    doLongRunningOpertation(); 

    log.debug("Messages are {}", messages);//messages appear to be correct at this point
    input.addMessages(messages);

    return input; //Return to third party library here
}

此函数返回后,第三方库将处理向前端显示消息。我看到的问题是,前端显示的消息有时包含的消息多于或少于应有的消息。我还要注意,该程序不是多线程的。

我的代码中是否缺少任何可能导致此竞争状况的内容?

1 个答案:

答案 0 :(得分:2)

嗯,可能发生了很多事情,但是我认为您的代码看起来还不错。

要考虑的事情...

messages方法中,doLongRunningOperation()列表是否完全传递了?如果是这样,是否可以随时将其放置到类变量中?

每次将InputObject传递到您的代码中时,它是一个新对象吗?如果没有,那可能会引起问题。

InputObject messages变量在您的代码中是否为空?

您可以考虑返回InputObject的新实例,而不是使用发送到您的方法的实例。

您可以注释掉长期运行的过程,以查看问题是否一直存在。

如果您看到在特定的开发环境中重复出现该问题,则可以在InputObject.addMessages()方法中放置一个调试断点,并查看何时调用它。

只需考虑一些想法,也许就可以尝试帮助调试问题。