由于java的内存模型的原因,在c++中的双重检查模型在java中不可用:
public static singleton getinstance() {
if(instance==null) {
synchronized(this) {
if(instance==null) {
instance=new singleton();
}
}
}
return instance;
}如果采用synchronized方法,又会严重影响性能:
public static synchronized singleton getinstance() {
if(instance==null) {
instance=new singleton();
}
return instance;
}如何实现lazy singleton?方法是利用java的classloader即时装载特性,使用一个singletonholder实现:
static class singletonholder {
static singleton instance = new singleton();
}public static singleton getinstance() {
return singletonholder.instance;
}这里利用java classloader特性,在第一次加载singletonholder的时候初始化实例,并且保证了没有多线程并发问题。
闽公网安备 35060202000074号