文章目录
单例模式的作用
- 单例模式的作用
- 单例模式的使用场景
- 饿汉式
- 饿汉式 (静态常量 可用)
- 饿汉式 (静态代码块 可用)
单例模式的好处, 主要有三个:
- 节省内存和计算 例如如下的Resource类中, 该类的构造方法的三个属性需要做比较消耗资源的操作, 例如从磁盘数据库中获取一些数据. 因此对于这种类, 最好是只用创建一次就行了, 节省资源和时间.
- 保证结果正确 例如当进行多线程统计的时候, 用一个全局的单例计数器去统计, 如果每个线程都用自己的计数器去统计, 那么统计的结果可能就不正确了.
- 方便管理 对于工具类而言, 只需要一个实例, 便于管理, 节省内存 .
- 无状态的工具类: 比如日志工具类, 不管是在哪里使用, 我们需要的是它帮我们记录日志信息, 除了这个作用之外, 并不需要在它的实例对象上存储任何状态, 这个时候我们只需要一个实例对象即可.
- 全局信息类: 例如网站的统计访问次数. 那么无论是访问a页面还是b页面, 都会加上统计次数, 那么就适用于单例对象去统计.
饿汉式单例模式的概念: 在类加载的时候, 就把实例初始化完毕了. 看起来是非常饿的, 因此是饿汉式的.
饿汉式 (静态常量 可用)如下的代码为 单例模式饿汉式的静态常量写法: 优点:
- 写法简单
- 由于成员变量加了static , 因此类在装载的时候就完成了实例化, 这样就避免了线程同步问题. 因为类的加载是由虚拟机自身保证线程安全的. 在这种情况下, 其他线程拿到的实例,永远是单例的实例.
package com.thread.jmm;
/**
* 类名称:Singleton1
* 类描述: 饿汉式 ( 静态常量) 可用
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/6 19:26
* Version 1.0
*/
public class Singleton1 {
/**
* 各个修饰符的作用
* private : 防止外部直接通过类名.INSTANCE 来获取实例, 而应该只能通过getInstance()来获取实例.
*static :确保其唯一性
final : 确保成员变量一经初始化就不能被改变.
/
private final static Singleton1 INSTANCE = new Singleton1();
/**
* 单例模式的构造方法都是私有的, 防止其他对象new
*/
private Singleton1() {
//可用用于初始化的一些操作
}
/**
* 返回单例模式对象
* @return
*/
public static Singleton1 getInstance() {
return INSTANCE;
}
}
饿汉式 (静态代码块 可用)
如下的代码为静态代码块的写法 . 优缺点与上面的写法一致. 只是创建对象的过程, 写在了如下的static 静态的代码块中.
package com.thread.jmm;
/**
* 类名称:Singleton1
* 类描述: 饿汉式 ( 静态代码块) 可用
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/6 19:26
* Version 1.0
*/
public class Singleton2 {
private final static Singleton2 INSTANCE ;
static {
INSTANCE = new Singleton2();
}
/**
* 单例模式的构造方法都是私有的, 防止其他对象new
*/
private Singleton2() {
//完成初始化等操作...
}
/**
* 返回单例模式对象
* @return
*/
public static Singleton2 getInstance() {
return INSTANCE;
}
}