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 时,该方法是线程安全的。您不能按原样操作字符串。

  • 该文档确实表明它线程安全的。(通过强调任何

由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。

  • 第三,JNI 接口使用 C 语言jobjectjstring是其中之一,并且按照jobject定义都是不可变的。因此,在本机 c 级别上,我们也保留了线程安全性。

命名这些,我们有充分的理由说它是线程安全的。

PS:但是,如果您使用多个类加载器,您最终可能会得到具有挑战性的结果,因为字符串池是按String-class.

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