2017-08-05 3 views
0

サーブレットは同時に複数のリクエストを処理できることは明らかです。たとえば、サーバー(ソケット)上で接続が行われ、この接続を処理すると、サーバーは新しいスレッドを作成し、スレッドはサーブレットのdoGetを呼び出して何かを実行します。それが何かをしている間に別の要求が到着します。新しいスレッドは、他のhttpRequestインスタンスとhttpResponseインスタンスとともにdoGetを呼び出します。私はnetbeansとglasfishを使ってテストを行った。サーブレットのdoGetメソッドでは私が入れ:最初のリクエストが到着したときにサーブレット内のすべてのリクエストを処理するスレッドは1つだけと思われる

synchronized(obj){ 
try{ 
obj.wait(50000) 
    }catch(InterruptedException e) 
    { 
    } 

は、サーブレットが50秒になるまで、それ以上の要求を受け付けません。これは、後続の要求を取得するために、前のスレッドがそのジョブを実行し、別の要求を取得するために戻る必要があることを意味します。これは同期されたステートメントのためではないことを確認するために、私はブレークポイントを同期する前にいくつかのステートメントに置いていますが、到達しませんでした。

答えて

1

通常、サーブレットフレームワークはマルチスレッドです。

私は2つの可能な説明と考えることができます:あなたのクライアントは、シングルスレッドである

  • 。すなわち、第2の要求は、第1の要求からの応答が受信されるまで送信されない。

  • 何らかの形で、GlassFishにワーカースレッドが1つだけ設定されています。

あなたの問題がobjロックではないことを確認するために、あなたのテストで誤解されていることも可能です。ローカルロックを使用するように変更してみてください。例えば

Object obj = new Object(); // ensure nothing else can see it!! 
    synchronized (obj) { 
     try { 
      obj.wait(50000) 
     } catch (InterruptedException e) { 
    } 
0

通常、サーブレットコンテナのワーカースレッドサイズに関するデフォルト設定を変更しないと、サーブレットはマルチスレッドになります。

あなたの説明の結果によると、objはクラス変数、インスタンス変数などの共有変数だと思います。 間違いがありますので、obj1インスタンスで同期させてはいけません。これにより、順次になります。

次のようなテストケースを変更することができます。

System.out.println(Thread.currentThread()); 
    try { 
     Thread.sleep(50000); 
    } catch (InterruptedException e) { 
     Thread.currentThread().interrupt(); 
    } 

そして、その結果を参照してください。

関連する問題