单例
一个类只有一个实例
实现单例的三个步骤:
1.私有化构造器
2.在本类中创建唯一实例(静态的变量)
3.提供一个公有的静态的get方法用于返回当前类的唯一实例
饿汉
当类一加载的时候就创建对象
优点: 调用效率高, 线程安全的
缺点: 如果这个类创建了一直没有使用, 则相当于浪费了资源
/**
* 饿汉单例
缺点:类初始化就new一个对象,如果不用会占用资源
优点:线程安全,效率高()
*/
public class HungrySingle{
private static HungrySingle INSTANCE = new HungrySingle();
private HungrySingle{};
public static HungrySingle getInstance(){
return INSTANCE;
}
}
懒汉
当类加载的时候不会创建对象, 只有当这个对象被显示获取时,
才去创建对象
优点: 实现了懒加载
缺点: 调用效率较饿汉低, 线程不安全
/**
* lazy单例
优点:不需要再初始化时就new一个对象,节约系统资源
缺点:每次使用都要new,如果参数很多,需要花费时间,效率低,而且线程不安全
*/
public class LazySingle{
private LazySingle {}
private static LazySingle INSTANCE;
public static LazySingle getInstance(){
if(INSTANCE == null){
/*
如果线程1进入if之后没有立即new LazySingle();
此时线程2也要满足条件INSTANCE==null,进入if,也需要new LazySingle();
此时就破坏单例,多次new
*/
INSTANCE = new LazySingle();
return INSTANCE;
}else{
return INSTANCE;
}
}
}
静态内部类
在类的内部定义一个私有的内部类, 在内部类中去创建唯一实例
即实现了懒加载, 又保证了线程安全
推荐使用
public class OutSingle{
private OutSingle{};
private static class InnerSingle{
private static final OutSingle INSTANCE = new OutSingle();
}
public static final OutSingle getInstance(){
return InnerSingle.INSTANCE;
}
}