3

たとえば、ユーザーがサーブレットにアクセスすると、そのサーブレットにはセッションに関する一連のアクションがあり、時間がかかる場合があります。その間、ユーザーは別のウィンドウを開き、セッションに関する別のサーブレットにアクセスします。これら 2 つのサーブレットは同じユーザーがアクセスするため、同じセッション変数を使用します。そのため、同期の問題が発生する傾向があると思います。

このような問題が存在する場合、問題を解決するのに十分な同期ブロックを使用していますか? (同期ブロックは同じスレッド内のものしか扱えないと思います。)

4

1 に答える 1

2

セッション自体はスレッドセーフです。ただし、これは、同期を行わずに使用しても正しい動作につながるという意味ではありません。これは、複数のスレッドからアクセスされた場合にセッションが正しく動作することを意味するだけです。

たとえば、次のコードが同時に実行されているとします。

Integer visitCount = (Integer) session.getAttribute("visitCount");
visitCount = Integer.valueOf(visitCount.intValue() + 1);
session.setAttribute("visitCount", visitCount);

の元の値が 0 であると仮定しますvisitCount。最終結果は 2 (期待値) になるか、1 になる可能性があります。実際、両方のスレッドが現在の値を同時に (0) 読み取り、両方がそれを 1 にインクリメントし、両方がセッションに保存します。

同様に、スレッドセーフでないオブジェクト (HashMap など) をセッションに格納し、2 つのスレッドがこの HashMap を同時に使用すると、異常な動作が発生する可能性があります。

すべてのマルチスレッド プログラムと同様に、必要に応じて適切な同期メカニズムを使用するか、オブジェクトをスレッド セーフにする必要があります。しかし、これは本全体の主題です。実際にはJava Concurrencyをお勧めします。

于 2012-09-16T08:03:24.360 に答える