单例模式(Singleton):保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个
饿汉式(推荐):
public class Singleton { // 类加载时生成实例对象,避免多线程时出问题 // 私有方法,避免被外部类直接访问 // 静态属性,保证实例对象可以在提供给外部类调用的方法内部使用 private static Singleton singleton = new Singleton() ; // 构造函数必须是私有的 // 这样在外部便无法使用 new 来创建该类的实例 private Singleton(){} // 静态方法,保证外部类调用时不需要生成对象 // 获取实例的唯一方法 public static Singleton getInstance(){ return singleton; } }
懒汉式(适用于有些类比较庞大,延迟加载有助于提升性能。):
public class Singleton { // 定义一个私有的静态全局变量来保存该类的唯一实例 private static Singleton singleton; // 构造函数必须是私有的 // 这样在外部便无法使用 new 来创建该类的实例 private Singleton() {} // 定义一个全局访问点 // 设置为静态方法 // 则在类的外部便无需实例化就可以调用该方法 public static Singleton GetInstance() { /** * 所以在没有第一重 singleton == null 的情况下,也是可以实现单例模式的?那么为什么需要第一重 singleton == null 呢? * 这里就涉及一个性能问题了,因为对于单例模式的话,new Singleton()只需要执行一次就 OK 了, * 而如果没有第一重 singleton == null 的话,每一次有线程进入 GetInstance()时,均会执行锁定操作来实现线程同步, * 这是非常耗费性能的,而如果我加上第一重 singleton == null 的话, * 那么就只有在第一次,也就是 singleton ==null 成立时的情况下执行一次锁定以实现线程同步, * 而以后的话,便只要直接返回 Singleton 实例就 OK 了而根本无需再进入 lock 语句块了,这样就可以解决由线程同步带来的性能问题了。 */ // 这里可以保证只实例化一次,即在第一次调用时实例化,以后调用便不会再实例化,第一重 singleton == null if (singleton == null) { synchronized (Singleton.class) { // 第二重 singleton == null if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }