繁体   English   中英

String.intern()线程是否安全

[英]Is String.intern() thread safe

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

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

但是,您可能需要重新考虑使用此工具来减少内存消耗。 原因是您无法从实习字符串列表中删除任何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;
    }
}
  • 返回不可变的Java-String时,该方法是线程安全的。 您无法按原样操纵String。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM