hooyantsing's Blog

P29 单例(静态常量饿汉式)

字数统计: 575阅读时长: 2 min
2020/11/08

尚硅谷Java设计模式(图解+框架源码剖析)

什么是单例?

所谓的类单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的静态方法

比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象,SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这时就会使用到单例模式。

单例模式使用场景

需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常使用到的对象、工具类对象、频繁访问的数据库或文件的对象(比如数据源、session工厂等)。

单例设计模式八种方式

  1. 饿汉式(静态常量)
  2. 饿汉式(静态代码块)
  3. 懒汉式(线程不安全)
  4. 懒汉式(线程安全,同步方法)
  5. [禁用]懒汉式(线程不安全,同步代码块)
  6. 双重检查
  7. [推荐]静态内部类
  8. **[最推荐]**枚举

饿汉式(静态常量)

优点:写法简单,就是在类装载时就完成实例化,避免了线程同步的问题。

缺点:类装载时就完成实例化,没有达到Lazy Loading(懒加载)的效果,如果从始至终从未使用这个实例,则会造成内存浪费。

这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,在单例模式中大多数都是调用getInstance方法,但是导致类装载的原因有很多种,因此不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化Instance就没达到懒加载的效果。

结论:这种单例模式可用,可能造成内存浪费。

1
2
3
4
5
6
7
8
9
10
11
12
class Singleton {
// 1.构造器私有化,防止外部new
private Singleton(){}

// 2.类本身内部创建对象实例
private final static Singleton INSTANCE = new Singleton();

// 3.提供一个公有的静态方法,返回实例对象
public static Singleton getInstance(){
return INSTANCE;
}
}
CATALOG
  1. 1. 什么是单例?
  2. 2. 单例模式使用场景
  3. 3. 单例设计模式八种方式
  4. 4. 饿汉式(静态常量)