String.intern()线程安全保证?

是否有任何文件certificateString.intern()是线程安全的? javadoc暗示它但没有直接解决它:

返回字符串对象的规范表示。 最初为空的字符串池由String类私有维护。

调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串。 否则,将此String对象添加到池中,并返回对此String对象的引用。

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

所有文字字符串和字符串值常量表达式都是实体。 字符串文字在The Java™Language Specification的3.10.5节中定义。

值得注意的是,javadoc说保证池中的String被返回,但不是池本身是线程安全的(因此写入它似乎会打开门,以便在竞争线程中更换池条目,虽然我认为这种解释不太可能)。

并且String的JDK源显示intern()是一个本机方法,它不会对其线程安全性有所了解:

 public native String intern(); 

我关心的是以下是否完全线程安全,保证在并发请求面前,每个唯一字符串值只创建一个MyObject (不仅仅存储在缓存中):

 public void myMethod(String myString) { // Get object from cache, the cache itself is thread safe MyObject object = myCache.get(myString); if (object == null) { synchronized(myString.intern()) { // Retry cache to avoid race condition object = myCache.get(myString); if (object == null) { object = new MyObject(myString); // ... do some startup / config of the object ... myCache.put(object); } } } // do something useful with the object } 

我希望避免同步方法或缓存本身,因为对象的创建可能需要一些时间(需要网络访问)。 有一些解决方法,如维护本地线程安全缓存/字符串池,但除非必要,否则不值得做。 String.intern()的内存含义(无法从缓存中删除实际的字符串)与此特定用例(使用少量字符串)无关。

我相信String.intern()是线程安全的,上面的代码很好,但缺乏来自信誉良好的源的直接确认让我有点担心。

此问题曾在此处多次提出,但未提供具体参考答案:

  • String.Intern()线程是否安全
  • intern’d字符串如何在不同的线程和类加载器之间表现?

这实际上听起来像你可能想要一个Guava Striped ,它以散列的方式将对象映射到锁。 如果您正在使用的任何其他代码具有相同的想法,那么在实习字符串上进行同步似乎是一种潜在的危险黑客,可能会产生奇怪的副作用 。