灵魂拷问
我对单例模式的了解是,在堆内存中开辟一个内存空间,在初始化时便进行编译,以便于减少后续开销。说人话就是一个类仅创建一个实例,并提供一个全局访问的点。
但是,饿汉式我是知道,懒汉式是个啥呦。
单例模式定义
单例模式的核心是:
一个类仅创建一个实例,并提供一个访问他的全局访问的点
条件:
1.一个类仅有一个实例
2.它必须自行创建这个实例
3.提供一个全局访问的点
废话不多少,上代码:
public class Singleton {
//饿汉式最重要的,需要初始化变量
/**
* 1.一个类只会创建一个实例
*/
private static Singleton instance = new Singleton();
/**
* 2.构造器,他可以自行构建
*/
private Singleton(){}
/**
* 3.提供一个给全局访问的点
*/
public Singleton getInstance(){
return instance;
}
}
好的,一个简单的单例模式就构建好了。
这个有一个缺点。每次启动的类加载阶段,便会自动创建。
那我们能不能在用的时候再创建,以便节约内存。
单例模式(懒汉模式)
其实取名懒汉,多少是和懒加载有关系。
我们简单实现下。
public class Singleton {
//饿汉式最重要的,需要初始化变量
/**
*
*/
private static Singleton instance = null;
/**
* 构造器,他可以自行构建
*/
private Singleton(){}
/**
* 提供一个给全局访问的点
*/
public Singleton getInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
好吧,这个多线程就会炸裂,
这样加锁和double-check就完美了
public class Singleton {
//饿汉式最重要的,需要初始化变量
private static Singleton instance = null;
/**
* 2.构造器,他可以自行构建
*/
private Singleton(){}
/**
* 3.提供一个给全局访问的点
*/
public Singleton getInstance() {
//懒汉式,加锁
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
打完收工,每次学习设计模式都有新的感悟