我想在 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 时,该方法是线程安全的。您不能按原样操作字符串。
该文档确实表明它是线程安全的。(通过强调任何)
由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。
- 第三,JNI 接口使用 C 语言
jobject
。jstring
是其中之一,并且按照jobject
定义都是不可变的。因此,在本机 c 级别上,我们也保留了线程安全性。
命名这些,我们有充分的理由说它是线程安全的。
PS:但是,如果您使用多个类加载器,您最终可能会得到具有挑战性的结果,因为字符串池是按String-class
.
A pool of strings, initially empty, is maintained privately by the class String.
于 2013-02-10T13:12:09.457 回答