字符串实习生用于同步

时间:2015-03-25 14:29:11

标签: java string java-ee synchronization thread-safety

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()相处会有什么不同。我试过,结果是一样的, 在我看来,我不能正确理解实习生是如何工作的。

1 个答案:

答案 0 :(得分:1)

就同步和线程安全而言,intern()没有任何区别。 Map使用字符串的哈希码来查找值,并且此值不会更改(String是不可变的或“值类型”)。使用它作为关键始终是安全的。 synchronized上的map将确保并行访问不会破坏地图的内部数据结构。它对String本身没有影响。

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

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