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()相处会有什么不同。我试过,结果是一样的, 在我看来,我不能正确理解实习生是如何工作的。
答案 0 :(得分:1)
就同步和线程安全而言,intern()
没有任何区别。 Map
使用字符串的哈希码来查找值,并且此值不会更改(String
是不可变的或“值类型”)。使用它作为关键始终是安全的。 synchronized
上的map
将确保并行访问不会破坏地图的内部数据结构。它对String本身没有影响。
String.intern()
有时会有所不同。在这种情况下,您可以使用池来节省一些内存。许多这里意味着100'000 +。将它用于几千个字符串是没有意义的; Java在这个领域被优化为死亡。只是将值放入池中通常会使池没有太大的好处。