2012-02-15 3 views
0

それは、以下の例では、条件が真となることを言う:インターナショナルな文字列は、スレッドとクラスローダーの間でどのように振る舞いますか? Javaのドキュメントで

String a = new String("ABC"); 
String b = new String("ABC"); 

if (a.intern() == b.intern()) 
{ 
.... 
} 

abが異なるThreadsで定義された、あるいはされていることを考慮する際にそれがまだ真であるならば、私は、知りたいと思いました異なるClassLoaders?私は、エンティティの名前に基づいて、特定のコンフィギュレーションをロードブロックを同期する機能を必要なときに

この質問は上昇し、そのように私は何かをしたかった。私はこれがあるかわからない

synchronized (entityName.intern()) 
{ 
} 

良い練習なので、私はおそらくこの方向性を追求するつもりはない - しかし、質問はまだ私に興味がある。

答えて

3

異なるスレッドの場合、条件は真です。

異なるクラスローダーの場合、私は条件が真であるとは考えません。 (ただし、異なるクラスローダーを使用してStringの2つのコピーを実際にロードしていますか?)ドキュメントには、String内にinternが実装されており、独自のキャッシュを使用しています。 String#intern documentationから:

文字列オブジェクトの正規表現を返します。

最初に空の文字列プールは、プライベートにのクラスStringによって保持されます。

(マイ強調)

だから、何とか(私はあなたがそれを行うだろうかわからないんだけど、私は賭けの方法があります)異なるクラスローダを使用して二回Stringクラスをロードした場合、 2つのStringクラスはそれぞれ独自のキャッシュ  —をの理論に持っています。しかし、その実装は、その罰金を区別しないかもしれません。 internは、C++で実装されたシンボルテーブルを使用して、Oracle JVMのネイティブメソッドです。私は、あなたが話しているケースでは、同じJVM内のStringの2つのインスタンスが同じシンボルテーブルを共有するかどうかを知るために十分に論理をたどっていません。しかし、その時点で、我々は実装を見ています。 文書は、同じ文字列ではないことを示しています。

+0

最も論理的な答えのようですね、ありがとう。 – RonK

0

はい - インターンはJVM全体で機能します。

java.lang.Stringの複数のバージョンを異なるクラスローダー経由で読み込んでいた場合、私はあなたの実行環境を非常に心配していました...インターンシップはあなたの心配ではありません。

+0

2つの異なるクラスローダーを使用して 'String'を2回読み込んでも、JVM全体に適用されます。 –

+0

@ T.J.Crowderまあ、私はかなり可愛いです。私はあなたの説明が好きです - あなたの答えに私のクイックドロー+1よりも少し考えを示しています:) – Bohemian

関連する問題