24

Tomcat (または他のサーバー) の 1 つのインスタンスに同じアプリケーションの 2 つのインスタンスをデプロイして実行するとします。次に、(Singleton クラスの) 単一のオブジェクトが作成されます。

  1. Tomcat の 1 つのインスタンス間 (ただし、同じアプリケーションの 2 つのインスタンスでは共通) または
  2. アプリケーション インスタンス全体 (アプリケーションの 2 つのインスタンスで異なる)

したがって、本質的に、Singleton クラスの単一のオブジェクトが JVM ごとに作成されるのは常にケースであることを理解したいですか? Web サーバー (またはコンテナー) でホストされているアプリケーションの場合、これはどのように機能しますか。

4

5 に答える 5

35

シングルトン クラスがあり、Tomcat でこのクラスを使用する 2 つの Web アプリケーションを実行すると、Tomcat を実行する JVM で、両方の Web アプリケーションがこのシングルトンの 2 つの異なるインスタンスを取得します。

ただし、webapp が JRE または Tomcat 共有ライブラリのシングルトンを使用する場合、たとえば Runtime.getRuntime webapps は Runtime の同じインスタンスを取得します。

これは、Tomcat が Web アプリケーションに個別のクラス ローダーを使用するためです。webapp クラス ローダーがクラスをロードするとき、最初に webapp クラス パスでクラスを見つけようとします。クラスが見つからない場合は、親クラス ローダーにクラスをロードするように要求します。

于 2013-07-18T10:58:28.030 に答える
22

通常、シングルトンは a ClassLoaderonly に結び付けられます。

したがって、.war ファイルに .class ファイルに基づくシングルトンがあり、この Web アプリケーションを複数回デプロイすると、各アプリケーションは独自のシングルトンを取得します。

一方、シングルトンの .class ファイルが のクラスパスにあるtomcat場合、インスタンスは 1 つしかありません。この .class は特定の Web アプリケーションに属していません (tomcatインスタンスに属しています)。

両方の場所にシングルトンがある場合、それはクラスローダーの階層に依存し、「親が最初」または「Web アプリケーションが最初」のいずれかを選択できる可能性があります。

于 2013-07-18T11:04:10.160 に答える
1

<shakey-ground>私の知る限り、シングルトンはクラスローダーごとに一意です。したがって、あなたの質問に対する答えは、コンテナーが Web アプリケーションをロードする方法に依存すると思います。

Web アプリごとに 1 つのクラスローダーを割り当てると、完全に独立したシングルトン オブジェクトが 2 つ得られるように見えます。1 つのクラスローダーが割り当てられ、すべての Web アプリがそれを使用する場合、それらは同じシングレット 1 インスタンスを共有します。</shakey-ground>

于 2013-07-18T10:58:36.060 に答える