单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。单例模式结构图如下所示:
Singleton类定义了一个GetInstance方法,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。
上述代码在多线程的情况下,会创建多个对象,当有多于两个线程同时进入instance==null的判断中,就会创建多个对象,所以代码要加上线程同步。
上述代码保证了线程同步,但当一个线程进入同步块时其他线程会一直等待进入线程释放资源,效率较低,所以代码不需要对所有线程都加锁,这称为双重锁定。
还有一种静态初始化的方法实现单例模式,在全局变量声明时初始化,也就是在类加载时就已经初始化了,称为饿汉式单例类,而上述方法在使用时初始化,称为懒汉式单例类。