Singleton Bean 中可能的竞争条件

Possible Race Condition in Singleton Bean

我 运行 陷入了从第三方库调用的 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
}

根据此函数的 return,第三方库处理向前端显示消息。我看到的问题是,前端显示的消息有时会包含比应有的多或少的消息。我还应该注意该程序不是多线程的。

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

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

需要考虑的事项...

messages 列表是否在 doLongRunningOperation() 方法中传递?如果是这样,是否随时将其放入 class 变量中?

InputObject 每次传入您的代码时都是一个新对象吗?如果不是,那可能会导致问题。

InputObject messages 变量进入您的代码时是否为空?

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

您可以注释掉冗长的 运行 过程,看看问题是否继续发生。

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

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