Java で String.intern() を使用してメモリを節約したいと思います (同じ内容の文字列には内部プールを使用します)。このメソッドを別のスレッドから呼び出します。それって問題ですか?
1765 次
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言語を使用します
jobject
。jstring
はそれらの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 に答える