您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

java持续实践 发布时间:2020-09-06 19:36:53 ,浏览量:1

文章目录
      • 单例模式的作用
      • 单例模式的使用场景
      • 饿汉式
        • 饿汉式 (静态常量 可用)
        • 饿汉式 (静态代码块 可用)

单例模式的作用

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

  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 :  防止外部直接通过类名.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;
    }

}

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0396s