簡體   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