一、饿汉模式
步骤:
- 对象构造私有化
- 私有静态当前类类型的字段
- 提供公共,静态对外的访问方法获取对象
饿汉模式代码
public class Singleton_Simple {
private static final Singleton_Simple simple = new Singleton_Simple();
private Singleton_Simple(){}
public static Singleton_Simple getInstance(){
return simple;
}
}
特点:饿汉模式线程安全,但是存在加载效率低下的问题
使用静态内部类块优化
二、懒汉模式
懒汉模式代码
1 使用同步方法
public class Singleton_lazy {
private static Singleton_lazy lazy = null;
private Singleton_lazy(){}
public static synchronized Singleton_lazy getInstance(){
if( lazy == null ){
lazy = new Singleton_lazy();
}
return lazy;
}
}
特点:懒汉模式容易造成线程不安全问题,同步方法【synchronized】解决线程问题
2 使用双重校验
public class Singleton_DoubleKey {
private static Singleton_DoubleKey doubleKey = null;
private Singleton_DoubleKey (){}
public static Singleton_DoubleKey getInstance(){
if( doubleKey == null ){ //①
synchronized(Singleton_DoubleKey.class){ //②
if( doubleKey == null ){ //③
doubleKey = new Singleton_DoubleKey(); //④
}
}
}
return doubleKey;
}
}
特点:懒汉模式容易造成线程不安全问题,同步代码块【synchronized】解决线程问题,使用双重校验
应用:保证被创建一次,节省系统开销,(在 spring 配置文件中定义的 bean 默认为单例模式)