String.intern()线程是否安全

ran*_*anr 13 java string thread-safety

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

Eli*_*son 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • (加上锁定,因为OP要求线程安全) (3认同)
  • 您还可以提到可怕的`intern`性能。如果我没记错的话,时间复杂度是O(* n *),其中* n *是字符串池的当前大小。 (2认同)