1.概念
单例模式是指确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。
2.实现方式
2.1 普通实现方式:分为饿汉式和懒汉式。
2.1.1饿汉式:
特点:
1.随着类加载的同时创建对象
2.线程安全
1.类中创建静态的私有的本类对象,并实例化,防止外界访问,
2.将构造方法私有,防止外界访问,
3.为外界提供公共的静态方法,方便访问类中实例。
普通标准代码:
public class Student {
private static Student s = new Student();
private Student(){
}
public static Student getStudent(){
return s;
}
}
Java中的单例模式体现:Runtime类
2.1.2懒汉式:
特点:
1.使用时创建对象
2.线程不安全
1.类中创建静态的私有的本类对象,
2.将构造方法私有,防止外界访问,
3.为外界提供公共的静态方法,外界调用该方法时判断静态变量是否为null,为null, 实例化,并返回值;不为null,直接返回值。
public class Teacher {
private static Teacher teacher = null;
private Teacher(){
//Runtime.getRuntime();
}
public static synchronized Teacher getTeacher(){
if(teacher == null)
teacher = new Teacher();
return teacher;
}
}
由于懒汉式会有线程安全的问题,所以开发过程中一般用饿汉式,不推荐懒汉式。
2.2 进阶实现方式:DCL方式和静态内部类方式
2.2.1 Double CheckLock方式
2.2.2 静态内部类方式
DCL方式虽然在一定程度上解决了资源消耗、多余的同步、线程安全等问题,但还是会有双重检查锁定失效的问题。而静态内部类方式,当第一次加载Singleton类时,并不会初始化sInstance,只有在第一次调用Singleton的getInstance()方法时才会使sInstance初始化。
public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.sInstance;
}
private static class SingletonHolder{
private static final Singleton sInstance = new Singleton();
}
}