饿汉式、懒汉式以及内部类实现单例
单例模式
- 写在前面
本篇内容只是简单介绍懒汉式和饿汉式,由于我知识掌握有限,关于线程安全问题以及他们的改进,在后续学习中,我会更新,仅供参考。
在CSDN看到一篇关于他们的改进:
https://blog.csdn.net/u011595939/article/details/79972371
- 单例:一个类只有一个实例
1.1 饿汉式
" 管你用不用,类加载的时候就把对象造好 "
实现想法:
类里只有一个实例,实例是通过构造器创建的,
1、构造器私有
不能在类的外部通过new 构造器实例化
2、在类中产生唯一对象
封装成
static
3、返回这个唯一对象
静态方法
实现
public class HungryMode {
// 唯一实例
private static final HungryMode hungry = new HungryMode();
// 构造器私有
private HungryMode(){}
// 返回唯一对象
public static HungryMode getInstance(){
return hungry;
}
}
- 不管以后会不会使用到该实例化对象,先造出来再说,比较着急!!!所以
- 饿汉式实现的办法就是直接 new实例化
1.2 懒汉式
方法调用时再创建
- 确保使用的是同一个对象
- “ 我在,只要你需要,我就出现 ”
实现
public class LazyMode {
// 自身实例化对象设置成属性
private static LazyMode lazyMode;
// 构造器私有
private LazyMode(){}
// 方法调用时,实例对象
public static LazyMode getInstance(){
if (lazyMode == null) { // 它没有饿汉安全,有一些特殊情况会出现多例 (线程问题!!!)
lazyMode = new LazyMode();
}
return lazyMode;
}
}
1.3 内部类实现单例
懒汉式的一种,这种懒汉式没有线程问题
- 结合了饿汉式和懒汉式的优点:
只要不调用getInstance 方法,就不会使用内部类;内部类一旦被使用一次,就只会被初始化一次,以后一直用的是INSTANCE静态常量
实现
public class InnerMode {
// 私有化构造器
private InnerMode(){}
/**
* 一个私有的静态内部类,用于初始化一个静态final实例
*/
private static class SingletonHolder{
private static final InnerMode INSTANCE = new InnerMode(); // 外部对象
// 静态常量一直存在,不会被回收,稍微有点耗资源
}
public static InnerMode getInstance(){ // 这个方法不调用,就不给下面的对象
return SingletonHolder.INSTANCE;
}
}