1

さまざまな場所でビルダー パターンが推奨されているのを見てきましたが、Struts を使用する Web アプリケーション内のスレッド セーフについては確信が持てませんでした。

静的メソッドの変数buildが共有されているのか、ビルダー コードを呼び出す各スレッドの内部にあるのかは不明です。大丈夫だとは思いますが、ビルダー コードが Web アプリケーション内に存在し、一度に数十のスレッドによって呼び出される可能性があることを確認したいと思います。

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(これは悪い習慣です)。この場合、2 つのスレッドが同じ ActionForm インスタンスを使用できます。しかし、これは実際にはbuild()メソッドの問題ではありません。むしろ、設計上の問題、またはexecute()このセッション スコープの ActionForm を使用するメソッドの同期の問題です。

于 2012-10-29T16:42:17.807 に答える
1

コードを変更した後、メソッドにメンバー変数を使用していないため、コードはとにかくスレッドセーフであると言えますbuild()。複数のスレッドから同時に呼び出すことができbuild()、各スレッドは独自のメソッドレベル変数を使用します。

ところで、このクラスを静的にすることは、ここでは意味がありません。クラス コンテキストの静的修飾子は、内部クラスにのみ関連します。内部静的クラスは、外部クラスのインスタンスにアクセスできません。最上位クラスには外部クラスがまったくないため、インスタンスにアクセスできません。

于 2012-10-29T16:42:48.473 に答える