Java多线程 单例模式的概念与两种饿汉式写法

单例模式的作用

单例模式的好处, 主要有三个:

  1. 节省内存和计算
    例如如下的Resource类中, 该类的构造方法的三个属性需要做比较消耗资源的操作, 例如从磁盘数据库中获取一些数据. 因此对于这种类, 最好是只用创建一次就行了, 节省资源和时间.
  2. 保证结果正确
    例如当进行多线程统计的时候, 用一个全局的单例计数器去统计, 如果每个线程都用自己的计数器去统计, 那么统计的结果可能就不正确了.
  3. 方便管理
    对于工具类而言, 只需要一个实例, 便于管理, 节省内存 .

单例模式的使用场景

  1. 无状态的工具类: 比如日志工具类, 不管是在哪里使用, 我们需要的是它帮我们记录日志信息, 除了这个作用之外, 并不需要在它的实例对象上存储任何状态, 这个时候我们只需要一个实例对象即可.
  2. 全局信息类: 例如网站的统计访问次数. 那么无论是访问a页面还是b页面, 都会加上统计次数, 那么就适用于单例对象去统计.

饿汉式

饿汉式单例模式的概念:
在类加载的时候, 就把实例初始化完毕了. 看起来是非常饿的, 因此是饿汉式的.

饿汉式 (静态常量 可用)

如下的代码为 单例模式饿汉式的静态常量写法:
优点:

  1. 写法简单
  2. 由于成员变量加了static , 因此类在装载的时候就完成了实例化, 这样就避免了线程同步问题. 因为类的加载是由虚拟机自身保证线程安全的. 在这种情况下, 其他线程拿到的实例,永远是单例的实例.
package com.thread.jmm;

/**
 * 类名称:Singleton1
 * 类描述:  饿汉式 ( 静态常量) 可用
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/9/6 19:26
 * Version 1.0
 */
public class Singleton1 {

    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;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108435222
今日推荐