我已经看到了各种地方推荐的构建器模式,但是在使用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");
}
}
答案 0 :(得分:1)
上面的build()
方法只使用局部变量,并且不访问线程之间共享的任何状态,因此它是线程安全的。局部变量是每个方法调用的本地变量,因此不在线程之间共享。
唯一的线程安全问题是表单是否具有范围session
(这是一种不好的做法)。在这种情况下,两个线程可以使用相同的ActionForm实例。但这并不是build()
方法的问题。而是设计问题,或使用此会话范围的ActionForm的execute()
方法的同步问题。
答案 1 :(得分:1)
在您修改代码之后,我可以说您的代码无论如何都是线程安全的,因为您没有将任何成员变量用于build()
方法。您可以从多个线程同时调用build()
,每个线程将使用自己的方法级变量。
BTW使这个类静态没有任何意义。类上下文中的静态修饰符仅与内部类相关。内部静态类无权访问外部类的实例。顶级类根本没有外部类,所以它无论如何都无法访问它的实例。