サーブレット仕様では、コンテナーが my の単一インスタンスをインスタンス化し、複数のワーカー スレッドからサービス メソッド ( / )java.servlet.HttpServlet
を呼び出すことが規定されています。doGet()
doPost()
通常のスレッド化ルールによれば、誰かが何らかの時点で同期を手配しない限り、 init(ServeltConfig)
'happen before' のインスタンス レベル フィールドへの割り当てが、 を実行している他のスレッドによって同じフィールドから読み取られることは保証されません。doGet()
おそらく、コンテナは実際にはある種の外部同期を行って、実行された作業init()
が「後続の」スレッドに見えるようにします。
しかし、サーブレットの仕様は、私がスレッドセーフであることを明示的に保証していますか? 現時点ではそのような保証を見つけることができませんでしたが、認めざるを得ませんが、サーブレット 2.4 以降、仕様を端から端まで読んでいません。
編集
たとえば、一部の回答者が混乱しているため、私の質問は次のとおりです。次のクラスがスレッドセーフであると言うサーブレット仕様についてはどうですか?
@WebServlet (initParams = {@WebInitParam(name="b", value="true")})
public Decider extends HttpServlet {
private boolean b = false;
public void init(ServletConfig config) {
this.b = Boolean.parseBoolean(config.getAttribute("b"));
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
res.sendRedirect(b ? "/true" ? "/false");
}
}
確かに、もし私がするなら:
public static void main(String[] argv) {
HttpServlet s = new Decider();
Thread t1 = new Thread(new Runnable() {
public void run() {
s.init(...);
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
s.doGet(...);
}
});
t1.start();
t2.start();
}
...その後、スレッドのバグが発生します。コンテナーが必然的に異なる理由は何ですか?
編集2
「コンテナがそれを処理する」と主張するすべての回答は確かに歓迎されますが、私の質問は、サーブレット仕様がその動作を保証するかどうかについてです。この質問に適切に答えるには、サーブレットの仕様を参照する必要があります。(どのバージョンでも、私はクールです)。