1

私は現在、ApacheTomcatをWebサーバーとして使用するJavaEEで新しいWebアプリを構築しています。私は仕事でjspsとサーブレットを使用しています。

私の質問は:

私は非常に標準的なビジネスロジックを持っています。いずれも同期されていませんが、Webアプリロジックの単一のスレッドのみが常に実行されますか?

すべての機能を「同期」させると大きなオーバーヘッドが発生するので、それに代わるものはありますか?

プロジェクトに静的メソッドがある場合。これにより、次のような非常に単純なものになります。

       for (int i=0;i<10000;i++ ) {
           counter++;
       }

メソッドがスレッドセーフでない場合、マルチユーザーアプリでのそのようなメソッドの動作はどうなりますか?意外な振る舞いですか?!

そして再び簡単な方法で:

マルチユーザーWebアプリを構築する場合、プロジェクト内のすべてを「同期」する必要がありますか?すべてではない場合、何を同期する必要がありますか?

4

1 に答える 1

2

Webアプリロジックの単一のスレッドのみが常に実行されますか?

doService()いいえ、サーブレットコンテナは各サーブレットのインスタンスを1つだけ作成し、複数のスレッドからそのサーブレットのメソッドを呼び出します。Tomcatでは、デフォルトで最大200のスレッドが同時にサーブレットを呼び出すことが期待できます。

サーブレットがシングルスレッドの場合、アプリケーションは地獄のように遅くなりますSingleThreadModel。理由により非推奨になりました。を参照してください。

すべての機能を「同期」させると、大きなオーバーヘッドが発生しますが、それに代わる方法はありますか?

あります-あなたのコードはスレッドセーフかそれ以上でなければなりません-ステートレスです。サーブレットに状態がない場合(可変フィールド-異常など)、複数のスレッドから安全にアクセスできることに注意してください。同じことが事実上すべてのオブジェクトに当てはまります。

ループのあるサンプルコードでは、がローカル変数のfor場合、このコードはスレッドセーフです。counterフィールドだと危険です。各スレッドにはローカル変数のローカルコピーがあり、同じオブジェクトにアクセスするすべてのスレッドは同じフィールドに同時にアクセスします(同期が必要です)。

何を同期する必要がありますか?

可変、グローバル、共有状態。たとえば、サンプルコードで、counterがフィールドであり、複数のスレッドから変更されている場合、インクリメントを同期する必要があります(を検討してくださいAtomicInteger)。

于 2012-06-10T11:56:48.983 に答える