单例是设计模式中最为普遍的模式之一。
它是一种对象创建模式,用于产生类的具体实例,并确保系统中这个类只产生一个实例。
单例的好处:
1.对于频繁使用的对象,可以省略创建对象所花费的时间,从而避免频繁创建对象而消耗系统开销
2.由于new操作的次数减少,对系统内存的使用频率降低,可以减轻GC压力,缩短GC停顿时间
单例的核心:
通过一个接口返回唯一的对象实例
实现方式一
/**
* 饿汉式 缺陷:
* 1.因为instance、getInstance是static的,无法进行延迟加载
*/
public class Singleton {
//1.私有化构造方法
public Singleton(){
System.out.println("Singleton is create ");
}
//2.创建私有静态对象
private static Singleton instance = new Singleton();
//3.提供外部获取实例方法
public static Singleton getInstance(){
return instance;
}
}
实现方式二
/**
* 懒汉式 缺陷:
* 1.因为要避免多线程下的安全问题,需要对getInstance进行同步,所以性能要比饿汉式底。
*/
public class LazySingleton {
//1.私有化构造方法
private LazySingleton(){
System.out.println("LazySingleton is create");
}
//2.创建私有静态对象
private static LazySingleton instance = null;
//3.提供外部获取实例方法
public static synchronized LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
实现方式三:(建议)
/**
* 最优化方式:使用内部类
*/
public class StaticSingleton {
//1.私有构造
private StaticSingleton(){
super();
}
//2.私有内部类,私有StaticSingleton实例
private static class StaticSingletonHolder{
private static StaticSingleton instance = new StaticSingleton();
}
//3.提供外部获取实例接口
public static StaticSingleton getInstance(){
return StaticSingletonHolder.instance;
}
}
/*
备注:
1.使用内部类来实现单例模式,当StaticSingleton被加载时,其内部类并不会被初始化,所以可以确保
当StaticSingleton类被加载入JVM时,不会初始化单例对象
2.当getInstance()方法被调用时,才会加载内部类StaticSingletonHolder,从而初始化instance
3.由于实例的建立是在类加载时完成的,天生对多线程友好,getInstance()方法也不需要进行同步
*/
备注:来自《Java程序性能优化》知识点总结