单例模式讲解以及Spring中的单例实现
写在前面
最近在学习在spring源码,一直都是云里雾里,差一点就真的是从入门到放弃了,但是我不甘心呀我就开始思考,如何看源码更加容易,我想到一个解决方式就是看源码首先需要站在大的格局观来看其需要实现的功能,然后再Debug到每一行代码,这样理解起来就会容易得多。但是如何站在大的格局观,看其需要实现的功能呢?那么就不得不说设计模式了,Spring中也涉及到很多设计模式,所以在此把以前学习设计模式的东西都捡起来,结合spring源码学习一起来分享出来
国王只能有一个
首先一来,我就要建立一个国家,首先从过往开始
可是这个时候我们需要思考一个现实问题,那就是国王只有一个,那么我们在程序的设计中如何做到让一个类(国王)的实例只能有一个呢?实现方式又很多种,让我一一道来
我们java程序员都知道,对象都是靠new出来了,既然只能有一个国王,那么我们控制这个new不就可以了吗?
饿汉模式
public class King {
//在静态变量初始化的时候就将对象创建出来了,
private static King ourInstance = new King();
public static King getInstance() {
return ourInstance;
}
//将构造方法私有化,如此一来,外部就无法创建对象了
private King() {
}
}
到这里,单例的国王就创建完成了,好的,我们来看看单例模式的定义
单例模式:确保一个类只有一个实例,并提供一个全局访问点
是真的很简单,所以也没啥好讲的
本篇博客到此结束。。。。
可是真的就这么简单吗?当然不是的,
上面创建国王的过程有一个特点,就是 在静态变量初始化的时候就将国王实例化了,对于程序而言就是不论我们使不使用这个国王,他都把内存给占用了,当程序非常庞大的时候,就非常消耗内存,所以我们并不是非常推荐这么做。当然这种单例模式是线程安全的,我们称之为饿汉模式
懒汉模式
有没有一种方式,让国王是被选举出来的呢,就是当程序调用getInstance()这个方法的时候才会给我们创建一个国王。这种形式的创建当然有。其实也很简单 称之为懒汉模式
public class King {
private static King ourInstance ;
public static King getInstance() {
if (ourInstance==null) {
ourInstance = new King();
}
return ourInstance;
}
private King() {
}
}
可是这样一改了之后,程序就出现了一个问题,就是线程不安全了,就是当一群人选举出了一个国王的同时,另一群人也同时选举,两群人在if (ourInstance==null) 的条件判断时候都判断为空,那么就会创建两个国王,过么可怕,这个时候国家就会动荡起来,确实不太好,还有没方式来优化的?当然有!我们来锁住选举getInstance()的方法
public class King {
private static King ourInstance ;
public static synchronized King getInstance() {
if (ourInstance==null) {
ourInstance = new King();
}
return ourInstance;
}
private King() {
}
}
可是这样一做我们就返现,当一群人在选举国王的时候,其他人是没办法选举国王,在这种场景下似乎好像还说的过去,但是对于一个程序而言的话,那么效率是非常低下了,并不推荐这样操作,那么还有没有其他方式呢?有。我们用双重判断的方式就可以实现
public class King {
private static King ourInstance ;
public static King getInstance() {
if (ourInstance==null) {
synchronized (King.class){
if