Struts ActionServlet中的静态构建器类线程是否安全?

时间:2012-10-29 16:21:55

标签: java design-patterns struts

我已经看到了各种地方推荐的构建器模式,但是在使用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");
    }
}

2 个答案:

答案 0 :(得分:1)

上面的build()方法只使用局部变量,并且不访问线程之间共享的任何状态,因此它是线程安全的。局部变量是每个方法调用的本地变量,因此不在线程之间共享。

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

答案 1 :(得分:1)

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

BTW使这个类静态没有任何意义。类上下文中的静态修饰符仅与内部类相关。内部静态类无权访问外部类的实例。顶级类根本没有外部类,所以它无论如何都无法访问它的实例。