14

Java で String.intern() を使用してメモリを節約したいと思います (同じ内容の文字列には内部プールを使用します)。このメソッドを別のスレッドから呼び出します。それって問題ですか?

4

2 に答える 2

5

あなたの質問に対する簡単な答えはイエスです。スレッドセーフです。

ただし、メモリ消費を減らすために、この機能の使用を再検討することをお勧めします。その理由は、インターンされた文字列のリストから全体を削除できないためです。より良い解決策は、このための独自の施設を作成することです。必要なのは、文字列を次のHashMap<String,String>ように格納することだけです。

public String getInternedString(String s) {
    synchronized(strings) {
        String found = strings.get(s);
        if(found == null) {
            strings.put(s, s);
            found = s;
        }
        return found;
    }
}
于 2013-02-10T13:11:36.823 に答える
2
  • 不変のJava-Stringが返されるため、メソッドはスレッドセーフです。文字列をそのまま操作することはできません。

  • ドキュメントは、それがスレッドセーフであることを実際に示唆しています。(いずれかを強調することにより)

したがって、任意の2つの文字列sおよびtについて、s.equals(t)が真である場合に限り、s.intern()== t.intern()が真になります。

  • 第三に、JNIインターフェースはC言語を使用しますjobjectjstringはそれらの1つでありjobject、定義上、すべて不変です。したがって、ネイティブの経営幹部レベルでも、スレッドセーフを維持します。

これらに名前を付けると、スレッドセーフであると言う十分な理由があります。

PS:ただし、複数のクラスローダーを使用すると、String-poolがごとに維持されるため、結果が困難になる可能性がありますString-class

A pool of strings, initially empty, is maintained privately by the class String.
于 2013-02-10T13:12:09.457 に答える