单例模式特点:
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例
饿汉式
- 饿汉式单例模式:饿汉就是类一旦加载,就把单例初始化完成,保证getInstance时,单例已经存在
- 饿汉式在类创建的同时就已经创建好了一个静态的对象供系统使用,天生就是线程安全的
class SingletonH{
private SingletonH(){}
private static final SingletonH single = new SingletonH();
public static SingletonH getInstance(){
return single;
}
}
懒汉式
- 懒汉式单例模式:只有当调用getInstance时,才回去初始化这个单例
- Singleton通过构造方法限定为private避免了类在外部被实例化
class SingletonL {
private SingletonL(){}
private static SingletonL single = null;
public static SingletonL getInstance(){
if(single == null){
single = new SingletonL();
}
return single;
}
懒汉式——线程安全改进
public static synchronized SingletonL getInstance(){
if(single == null){
single = new SingletonL();
}
return single;
}
public static SingletonL getInstance(){
if(single==null){
synchronized(SingletonL.class){
if(single==null){
single = SingletonL();
}
}
}
return single;
}
public class SingletonL{
private static class LazyHolder{
private static final SingletonL Instance = new SingletonL();
}
private SingletonL(){}
public static final SingletonL getInstance(){
return LazyHolder.Instance;
}
}