单例模式的目的:全局唯一性。
实现的方式:构造函数私有化,静态方法返回单例对象
常见的实现模式及代码:
懒汉式:延迟加载,不会在启动的时候加载,降低了启动时间,
缺陷:在多线程环境下,有线程安全的问题。
例如:线程AB同时进入if 中的代码,但是A线程执行较快,B线程出现停顿,A在初始化完毕,并且赋值了之后,B才开始初始化,这时候 instance 的值就会出现问题。
public class SingleTon{
private static SingleTon INSTANCE = null;
private SingleTon(){}
public static SingleTon getInstance() {
if(INSTANCE == null){
INSTANCE = new SingleTon();
}
return INSTANCE ;
}
}
饿汉式:
启动的时候加载,增加了项目的启动时间
public class SingleTon{
private static SingleTon INSTANCE = new SingleTon();
private SingleTon(){}
public static SingleTon getInstance(){ return INSTANCE; }
}
加锁懒汉式:
在多线程环境下,会影响性能。
public class SingleTon{
private static SingleTon INSTANCE = null;
private SingleTon(){}
public static SingleTon getInstance(){
if(INSTANCE == null){
synchronized(SingleTon.class){
if(INSTANCE == null){
INSTANCE = new SingleTon();
}
}
}
return INSTANCE ;
}
}
静态内部类:
在调用getInstance方法的时候初始化,并且不存在线程安全问题。而且作为局部变量,INSTANCE 是不可被外部修改的。
public class SingleTon{
private SingleTon(){}
private static class SingleTonHoler{
private static SingleTon INSTANCE = new SingleTon();
}
public static SingleTon getInstance(){
return SingleTonHoler.INSTANCE;
}
}
如果是面试:
静态内部类:没有线程安全问题,在初始化类的时候加载。并且不影响启动时间。
懒汉式:有线程安全问题
饿汉式:以时间换空间,延长了启动时间。