今天来学习单例模式,这个模式比较简单,但是应用确实挺广的,属于入门级的设计模式。
带着问题出发
-
什么是单例模式? -
单例模式的几种实现?
单例模式介绍
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
-
某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 -
省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
其实概念很简单,即:「确保一个类只有一个实例,并提供全局访问点。」
实现
饿汉单例
public class Student1 {
// 2:成员变量初始化本身对象
private static Student1 student = new Student1();
// 1:构造私有
rivate Student1() { }
// 3:对外提供公共方法获取对象
public static Student1 getSingletonInstance() {
return student;
}
}
可以看到是依赖 JVM 在加载这个类时马上创建了此唯一实例,JVM 确保在任何线程访问 实例变量前,一定先创建此实例。适合于在创建和运行时方面不太繁重,急切需要此单件的情况。
懒汉-静态内部类
public class Student5 {
private Student5() {
}
/**
* 此处使用一个内部类来维护单例 JVM在类加载的时候,是互斥的,所以可以由此保证线程安全问题
*/
private static class SingletonFactory {
private static Student5 student = new Student5();
}
/* 获取实例 */
public static Student5 getSingletonInstance() {
return SingletonFactory.student;
}
}
懒汉-双重检查锁
public class Student5 {
/**
* volatile 关键字确保对象初始化完成,
* 避免出现指令重排序导致赋值不为 null,但是还未初始化的情况出现
*/
private volatile static Student5 student5;
private Student5() {}
/* 获取实例 */
public static Student5 getSingletonInstance() {
if (student5 == null) {
synchronized (Student5.class) {
if (student5 == null) {
student5 = new Student5();
}
}
}
return student5;
}
}
到这里我们就已经完成了单例模式的学习,相信你已经能在工作中根据场景选择不一样的实现方式,希望能为你提供帮助。
全文完,fighting!
往期设计模式系列文章点击查看:

被折叠的 条评论
为什么被折叠?



