用于同步的字符串实习生

String intern for synchronisation

public final static HashMap<String,Object> map = new HashMap<String, Object>();//global variable

//this is a post method

    String forSync = null;

//somewhere here init forSync
...

        if(forSync != null){
            Object obj = null;
            synchronized(map){
                obj = map.get(forSync);//can be not empty
                if(obj == null){
                    obj  = new Object();
                    map.put(forSync.intern(), obj );
                }
            }
        synchronized(obj){
//sync block
}

字符串未正确同步。这行得通还是我应该更改

        obj = map.get(forSync);
        obj = map.get(forSync.intern());

请您解释一下如果我使用 ought .intern() 会有什么不同。我试过了,结果是一样的, 看来我不太明白 intern 是怎么工作的。

就同步和线程安全而言,intern() 没有区别。 Map 使用字符串的哈希码查找值,并且此值不会更改(String 是不可变的或 "value type")。作为钥匙使用总是安全的。 synchronized on the map 将确保映射的内部数据结构不会被并行访问破坏。它对字符串本身没有影响。

如果您有许多具有相同值的字符串,

String.intern() 有时会有所不同。在那种情况下,您可以使用池来节省一些内存。许多在这里意味着100'000+。将它用于几千个字符串是没有意义的; Java这方面被优化死了。仅仅将值放入池中通常只会使池膨胀而没有太大好处。