通常我们可以让一个全局变量使得一个对象访问,但是它不能防止你实例化多个对象。一个最好的方法是,让类自己去保存它唯一的实例。而且对外只提供一个访问的入口,这就是单例模式。
单例模式的好处:
1、有些类创建很频繁,有些大的对象这是一笔很大的开销;
2、有时间只需要一个对象,每次实例化创建对象,会对程序造成干扰,比如一个班级只有一个班主任。
那么有人想问,那单例模式这么好,以后开发中都用单例模式了。其实在开发中还是根据业务不同来使用需要用单例模式不。
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局入口。
单线程的单例模式(懒汉)
package com.zwz.design.singel;
public class Singleton {
private static Singleton instance;
//提供私有的无参构造函数,禁止被外部实例化
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
package com.zwz.design.singel;
public class SingletonTest {
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println("两个对象是相同的实例吗?"+(instance1==instance2));
}
}
多线程单例模式
package com.zwz.design.singel;
public class Singleton {
private static Singleton instance;
private static Object lock=new Object();
//提供私有的无参构造函数,禁止被外部实例化
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized (lock) {
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
这里说下,肯定有人说都加锁了,为什么还要判断下对象是否为空。这里我想说,多线程下,假如有线程进去第一个判空里面了,这下就会重复初始化对象了。这也叫双重锁定。
静态初始化单例模式(饿汉)
package com.zwz.design.singel;
public final class Singleton {
private static final Singleton instance=new Singleton();
//提供私有的无参构造函数,禁止被外部实例化
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
懒汉式单例:要在第一次被引用时,才会实例化;
饿汉式单例:静态初始化,在自己加载时候就已经初始化了。