用于同步的字符串实习生
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这方面被优化死了。仅仅将值放入池中通常只会使池膨胀而没有太大好处。
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这方面被优化死了。仅仅将值放入池中通常只会使池膨胀而没有太大好处。