Initialization-on-demand holder 习语的疑惑
Doubts in Initialization-on-demand holder idiom
请参考link:Initialization-on-demand holder idiom
我有以下疑惑:
1) 何时在 java 中初始化内部静态 class?它是否与class的其他静态变量同时初始化?还是按需初始化。
2) 这种模式是否适合为 map/list 提供单例、线程安全访问和延迟加载。该地图将保存繁重的 sql 查询的结果。对该地图的访问需要是单例的、线程安全的并且地图应该按需初始化。
3) 这些行是什么意思:
However, the idiom is singleton-specific and not extensible to
pluralities of objects (eg a map-based cache).
具体来说:
not extensible to pluralities of objects (eg a map-based cache).
对于类似的东西,我建议你使用 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;
}
}
class 的静态成员在第一次请求 class 时初始化(如果我错了,请打我)。
这总是取决于你真正需要什么。我不是单身人士的忠实粉丝,但这总是取决于用例。
如果您只使用 getMyExpensiveMap()
函数访问缓存,我发布的代码是线程安全的。
请参考link:Initialization-on-demand holder idiom
我有以下疑惑:
1) 何时在 java 中初始化内部静态 class?它是否与class的其他静态变量同时初始化?还是按需初始化。
2) 这种模式是否适合为 map/list 提供单例、线程安全访问和延迟加载。该地图将保存繁重的 sql 查询的结果。对该地图的访问需要是单例的、线程安全的并且地图应该按需初始化。
3) 这些行是什么意思:
However, the idiom is singleton-specific and not extensible to pluralities of objects (eg a map-based cache).
具体来说:
not extensible to pluralities of objects (eg a map-based cache).
对于类似的东西,我建议你使用 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;
}
}
class 的静态成员在第一次请求 class 时初始化(如果我错了,请打我)。
这总是取决于你真正需要什么。我不是单身人士的忠实粉丝,但这总是取决于用例。
如果您只使用 getMyExpensiveMap()
函数访问缓存,我发布的代码是线程安全的。