DeferredResult 在返回可能已设置的实例时是否存在竞争条件?

Does DeferredResult have a race condition when returning a potentially already-set instance?

我在我的 Spring MVC 应用程序中使用 DeferredResult 来处理可能长 运行 操作的一些服务器端处理。它可能非常快,也可能需要一两秒。

但在任何一种情况下,传入的 HTTP 请求都会导致将操作推送到队列, 单独的 线程(通过 ExecutorService)负责消费。然后调用回调,通知推送器操作已完成。

我将其中一些行为重构为一个实用方法:

    public static DeferredResult<String> toResponse(GameManager gameManager, final Player player, Action action) {
        DeferredResult<String> deferredResult = new DeferredResult<>();
        gameManager.execute(action, new Handler<Result>() {
            @Override
            public void handle(Result result) {
                JSONObject obj;
                try {
                    obj = gameManager.getGameJSON(player);
                    obj.put("success", result.getResult());
                    obj.put("message", result.getMessage());
                    deferredResult.setResult(obj.toString());  // POINT B
                } catch (JSONException e) {
                    deferredResult.setErrorResult(e);
                }
            }
        });
        return deferredResult; // POINT A
    }

但我想知道 如果操作执行得如此之快以至于 setResult() 方法在DeferredResult 之前它已经返回(POINT A)到调用方法。

Spring 是否会看到返回的 DeferredResult 已经有一个值并处理它,或者它只是开始 "watching" 以便 setter 被调用 实例提供后?

我没有使用过 Spring,但我会说如果结算时间对下游行为有任何影响,Class DeferredResult<> 将是一个非常糟糕的延期实施。

似乎可以安全地假设行为是相同的,无论异步进程的时间如何——毫秒、秒或其他,唯一的条件是在这种情况下 onTimeout 处理程序不会发生超时会 运行 (如果设置)。即使 Deferred 是同步结算的,在创建它的同一代码块中,调用函数也应该按预期对结果进行操作。

如果此假设无效,则 Class DeferredResult<> 不符合目的且不应使用。