你真的了解单例模式么

应用最广的模式,单列模式

单列模式是用用最广的模式之一。 在应用这个模式的时候,单例对象的类必须在整个应用中只有一个实例存在。

单例模式一般有以下几个特点:

  1. 构造函数不对外开放,一般都是private。
  2. 通过一个静态的方法或者枚举返回对象。
  3. 确保多线程情况下只有一个实例对象。

单例模式通常有如下几种实现情况

  • 饿汉模式
    `public class Config {

    private static Config CONIG = new Config();

    private Config(){}

    public static Config getInstance(){
    return CONIG;
    } }`

    代码中Config不能通过new的方式来获得,只能通过getInstance的方式来获取。 而这个CONIG对象是静态的对象,并且在声明的时候已经初始化了,这就保证了对象的唯一性。

  • 懒汉模式
    懒汉模式是声明一个对象,并且在第一次调用getInstance的时候初始化。

public class Config {

private static Config CONFIG = null;

private Config(){}

public static synchronized Config getInstance(){
    if(CONFIG == null){
        CONFIG = new Config();
    }
    return CONFIG;
}

}

这种模式在getInstance方法前添加了synchronized关键字,保证他是一个同步方法,这就保证了在多线程中这个类的实例的唯一性。 但是你想下,即使Config已经被初始化了,每次调用getInstance都会进行方法同步,这就会消耗不必要的资源,这也是懒汉模式的一大缺点。 总结下,懒汉模式在第一次使用的时候才会实例化资源,最大的缺点是每次调用都需要不必要的同步,也浪费了很多资源。

  • 懒汉模式的改进

public class Config {

private static Config CONFIG = null;

private Config(){}

public static  Config getInstance(){
    if(CONFIG == null){
        synchronized (Config.class) {
            if(CONFIG == null){
                CONFIG = new Config();
            }
        }
    }
    return CONFIG;
}

}
这个改进都在getInstance上,进行了两次判空,一次同步。 第一个判断空是为了不必要的同步,第二次判断空是为了避免在多线程情况下多次创建实例。 因为假如有两个线程同时进入了第此判空,其中一个阻塞到synchronized之外,如果不判断空,第二个线程在执行的时候也会创建一个实例。

  • 静态内部类实现单例模式

public class Config {

private Config(){}

public static  Config getInstance(){
    return Holder.CONFIG;
}

private static class Holder{
    private static Config CONFIG = new Config();
}

}

这种模式只有当第一次调用getInstance的时候初始化,并且有JVM来保证线程安全与唯一性。 这种方法是推荐使用的单例模式。

  • 枚举单例
    这种模式还在研究之中,暂不做解释
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 7,019评论 12 68
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,004评论 19 139
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,655评论 1 8
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,572评论 4 34
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,119评论 18 399

友情链接更多精彩内容