请参阅链接:Initialization-on-demand holder idiom
我有以下疑问:
1)什么时候在java中初始化内部静态类?它是否与该类的其他静态变量同时初始化?或者是按需初始化。
2)此模式是否适合为地图/列表提供单例,线程安全访问和延迟加载。此映射将保存重sql查询的结果。对此映射的访问需要是单例,线程安全的,并且应该按需初始化映射。
3)这些线是什么意思:
然而,这个成语是单身特定的,不可扩展 多个对象(例如基于地图的缓存)。
具体来说:
不可扩展到多个对象(例如基于地图的缓存)。
答案 0 :(得分:0)
对于类似的东西,我建议您使用Double Checked Locking。
一个简单的例子:
package foo;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class ExampleLazyLoad {
private volatile ConcurrentMap<String, String> myExpensiveCache = null;
public ConcurrentMap<String, String> getMyExpensiveMap() {
if (myExpensiveCache == null) {
synchronized (this) {
if (myExpensiveCache == null) {
final ConcurrentMap<String, String> newCache = new ConcurrentHashMap<String, String>();
// init the map
myExpensiveCache = newCache;
} // if
} // synchronized
} // if
return myExpensiveCache;
}
}
第一次请求类时,会初始化类的静态成员(如果我错了,请打败我)。
它总是取决于你真正需要的东西。我不是单身人士的真正粉丝,但它总是取决于用例。
如果您只使用getMyExpensiveMap()
函数访问缓存,我发布的代码是线程安全的。