懒汉式:太懒了,等到需要的时候才加载。
这个不是线程安全的,所以一般用的极少:
public class Singleton{
private static Singleton singleton;
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
这个是线程安全的,但是synchronized粒度较大(但是好像新的jdk就已经改过来了?)
public class Singleton{
private static Singleton singleton;
public static Synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
饿汉式:比较饿,所以马上创建。
这种是安全的,但是还没用就初始化,效率自然就比较低啦。
public class Singleton{
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
DCL,双检锁,双重校验锁
这个是安全且高效的,也是面试的重点,主要聚集于volatile和synchorinized关键字。
public class Singleton{
private static volatile Singleton singleton;
public static Singleton getInstance(){
if(singleton == null){
Synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
参考自:菜鸟教程:单例模式