String.intern()线程是否安全

时间:2013-02-10 13:02:46

标签: java string thread-safety

我想在Java中使用String.intern()来节省内存(使用内部池来获取具有相同内容的字符串)。我从不同的线程调用此方法。这是一个问题吗?

2 个答案:

答案 0 :(得分:4)

对你的问题的简短回答是肯定的。这是线程安全的。

但是,您可能需要重新考虑使用此工具来减少内存消耗。原因是您无法从实习字符串列表中删除任何entires。更好的解决方案是为此创建自己的设施。您所需要的只是将字符串存储在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;
    }
}

答案 1 :(得分:1)

  • 返回不可变的Java-String时,该方法是线程安全的。你不能按原样操纵字符串。

  • 文档确实暗示 是线程安全的。 (通过强调任何

  

以下是对于任何两个字符串s和t,s.intern()== t.intern()   当且仅当s.equals(t)为真时才为真。

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

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

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

A pool of strings, initially empty, is maintained privately by the class String.