1

我在很多地方都看到过推荐的构建器模式,但不确定使用 Struts 的 Web 应用程序中的线程安全性。

我不清楚build静态方法的变量是由调用构建器代码的每个线程共享还是在其内部。我有一种预感,这没关系,但我想确保构建器代码存在于 Web 应用程序中,并且可以同时被 10 个线程调用。

public static class ExampleBuilder {

    public static Thing build(ActionForm form) {
        String property1 = form.property1;
        String property2 = form.property2;
        String propertyX = form.propertyX;
        ...

        return new Thing(property1, ...);
    }
}

public class ExampleStrutsAction extends Action {

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        Thing example = ExampleBuilder.build(form)
        return mapping.findForward("success");
    }
}
4

2 回答 2

1

上述build()方法只使用局部变量,不访问线程间共享的任何状态,因此是线程安全的。局部变量对于每个方法调用都是局部的,因此不在线程之间共享。

您可能遇到的唯一线程安全问题是表单是否具有范围session(这是一种不好的做法)。在这种情况下,两个线程可以使用相同的 ActionForm 实例。但这并不是build()方法的真正问题。而是设计问题,或execute()使用此会话范围的 ActionForm 的方法的同步问题。

于 2012-10-29T16:42:17.807 回答
1

在您所做的代码修改之后,我可以说您的代码无论如何都是线程安全的,因为您没有在build()方法中使用任何成员变量。您可以从多个线程同时调用 as build(),每个线程将使用自己的方法级变量。

顺便说一句,将此类设为静态在这里没有任何意义。类上下文中的静态修饰符仅与内部类相关。内部静态类无权访问外部类的实例。顶级类根本没有外部类,因此无论如何它都无法访问其实例。

于 2012-10-29T16:42:48.473 回答