`
我是你超哥哥
  • 浏览: 8451 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

java面试之单例模式的实现方法(几种单例模式)

阅读更多

说句实话, 这个问题把我问的一脸懵逼, 怎么会有这种面试题? 你如果问我双重检查锁的单利模式实现的利弊, 还ok, 第一次碰到, 网上百度下 , 真TMD有, 现在贴出来跟大家分享, 尤其注意 双重检查锁的单利模式就好了!

 

 

需要确保某个类只要一个对象,或创建一个类需要消耗的资源过多,如访问IO数据库操作等,这时就需要考虑使用单例模式了。

使用单例模式需要注意的关键点

  1. 将构造函数访问修饰符设置为private
  2. 通过一个静态方法或者枚举返回单例类对象
  3. 确保单例类的对象有且只有一个,特别是在多线程环境下
  4. 确保单例类对象在反序列化时不会重新构建对象

单例模式的几种写法

1. 饿汉式

/**
 * 饿汉式实现单例模式
 */
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}

2. 懒汉式

/**
 * 懒汉式实现单例模式
 */
public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    // synchronized方法,多线程情况下保证单例对象唯一
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

getInstance()方法中添加了synchronized关键字,使其变成一个同步方法,目的是为了在多线程环境下保证单例对象唯一。

优点: 只有在使用时才会实例化单例,一定程度上节约了资源。
缺点: 第一次加载时要立即实例化,反应稍慢。每次调用getInstance()方法都会进行同步,这样会消耗不必要的资源这种模式一般不建议使用。

3. DCL(Double CheckLock)实现单例

/**
 * DCL实现单例模式
 */
public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        // 两层判空,第一层是为了避免不必要的同步
        // 第二层是为了在null的情况下创建实例
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }

        }
        return instance;
    }
}

优点: 资源利用率高,既能够在需要的时候才初始化实例,又能保证线程安全,同时调用getInstance()方法不进行同步锁,效率高。
缺点: 第一次加载时稍慢,由于Java内存模型的原因偶尔会失败。在高并发环境下也有一定的缺陷,虽然发生概率很小。
DCL模式是使用最多的单例模式实现方式,除非代码在并发场景比较复杂或者JDK 6以下版本使用,否则,这种方式基本都能满足需求。

4. 静态内部类

/**
 * 静态内部类实现单例模式
 */
public class Singleton {
    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

    /**
     * 静态内部类
     */
    private static class SingletonHolder {
        private static Singleton instance = new Singleton();
    }
}

第一次加载Singleton类时不会初始化instance,只有在第一次调用getInstance()方法时,虚拟机会加载SingletonHolder类,初始化instance。

这种方式既保证线程安全,单例对象的唯一,也延迟了单例的初始化,推荐使用这种方式来实现单例模式。

5. 枚举单例

/**
 * 枚举实现单例模式
 */
public enum SingletonEnum {
    INSTANCE;
    public void doSomething() {
        System.out.println("do something");
    }
}

默认枚举实例的创建是线程安全的,即使反序列化也不会生成新的实例,任何情况下都是一个单例

分享到:
评论

相关推荐

    01 设计模式之单例模式.pdf

    在Java语言中,实现单例模式主要有以下几种方式: 1. 饿汉式(Eager Initialization) 饿汉式单例模式在类加载的时候就已经进行了实例化,因此它不需要考虑多线程同步的问题。这种方式在类加载时就完成了初始化,...

    逆向传值之单例传值

    在具体实现上,单例模式通常有几种常见的构造方式: 1. 饿汉式:在类加载时就完成实例化,避免了线程同步问题,但可能会造成不必要的内存浪费。 2. 懒汉式:只有在第一次调用getInstance()时才创建实例,但在多线程...

    JAVA面试设计模式.ppt

    在Java面试中,设计模式是衡量开发者能力的重要标准,因为它们能够提高代码的可读性、可维护性和复用性。以下是根据提供的内容对几种常见设计模式的详细说明: 1. **Singleton(单例模式)**: - 单例模式确保一个...

    JAVA面试问题,自己和别人总结

    * XML稳当定义的几种形式,它们之间的区别 五、J2EE、MVC方面 * MVC的各部分由哪些技术实现 * 为什么要分层 * 模式的相关知识,如单例工厂模式等 * 乱码的处理 * 一次请求的处理过程 六、数据库方面 * 存储过程...

    Java10道Java面试必备的设计模式面试题!.pdf

    在Java开发领域,设计模式是面试中不可或缺的一...理解并能够灵活运用这些模式,对于在Java面试中脱颖而出至关重要。同时,理解设计模式的意图、优缺点以及适用场景,也是评判一个开发者是否具备高级技能的重要标志。

    疯狂java讲义面试及设计模式

    在《Java设计模式(疯狂Java联盟版).chm》中,你将了解到23种经典的GOF设计模式,包括创建型模式(如单例模式、工厂模式、抽象工厂模式)、结构型模式(如代理模式、适配器模式、装饰器模式)、行为型模式(如观察...

    中兴软创java面试题

    - **单例模式**:学习几种常见的单例实现方式,如饿汉式、懒汉式、双重检查锁定等。 - **工厂模式**:理解简单工厂、工厂方法、抽象工厂模式的应用场景。 - **装饰器模式**:知道如何在不修改原有代码的基础上...

    Java面试之——代码与编程题

    【Java面试之——代码与编程题】是Java程序员在求职过程中常常遇到的面试环节,主要考察应聘者对Java语言的理解和实际操作能力。面试中,面试官可能会提出各种类型的编程题目,包括但不限于设计模式、继承机制、内部...

    香港JAVA面试笔试题目

    在Java面试中,面试官通常会考察候选人的基础知识、编程能力、设计模式理解、并发处理、内存管理以及对JVM(Java虚拟机)的了解。香港的JAVA程序员面试笔试题目可能涵盖以下几个关键领域: 1. **基础语法**:面试...

    【面试资料】-(机构内训资料)java面试题_设计模式(26题).zip

    在Java面试中,设计模式部分常常会涉及以下几个重点: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。面试时可能会问到如何实现线程安全的单例,如双重检查锁定(DCL)和枚举单例。 2. **工厂...

    谈面试时从写一个单例开始究竟能问多深及终极解决方案.docx

    通常,单例模式通过以下几种方式实现线程安全性: 1. **饿汉式(预加载)**:在类加载时就创建实例。 2. **懒汉式(延迟加载)**:在首次使用时创建实例。 3. **双重检查锁定**:结合懒汉式的延迟加载与同步机制。 ...

    Java高级面试题及答案真题(2021年Java面试题答案大汇总)

    创建型模式有五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式有七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式有十一种:策略模式、...

    2019最新整理Java面试题,常见面试题及答案汇总(史上最全最权威).rar

    熟悉常用的几种设计模式,如工厂模式、单例模式、观察者模式等;在数据库方面,SQL语句的优化,事务管理,以及JDBC操作等都会被考察;而JVM调优涉及类加载机制、内存分配策略、垃圾收集器的选择等。 最后,对于Java...

    JAVA面试题大全 经常考的

    单例模式、工厂模式、观察者模式、装饰器模式、代理模式、适配器模式等。 十一、Spring框架 13. Spring框架的核心功能是什么? Spring提供依赖注入(DI)、面向切面编程(AOP)、容器管理、数据访问/集成、Web框架...

    java面试题汇总2017版

    熟练掌握几种常用的设计模式是体现开发者经验的重要标志。 数据库操作方面,SQL语言的熟练掌握,事务处理、索引、JOIN操作、存储过程等都是面试中常见的问题。 最后,对于企业级应用,Spring框架的使用越来越普遍...

    java 面试宝典面试宝典

    Java面试宝典是Java开发者在求职过程中不可或缺的参考资料,它涵盖了Java编程语言的基础知识、进阶概念以及实际应用。这份面试宝典旨在帮助求职者全面准备Java相关的面试问题,提高成功获得理想职位的机会。 首先,...

    《Java面试》.pdf

    在Java面试中,以下几个知识点是常见的考察点: 1. **基础概念**: - **类与对象**:Java是一种面向对象的语言,类是对象的蓝图,对象是类的实例。理解类的定义、构造器、成员变量和方法是至关重要的。 - **封装*...

    java面试题视频百度云分享java面试题视频百度云分享

    - **单例模式**:理解单例模式的设计思想,掌握其实现方法(懒汉式、饿汉式、枚举式等)。 - **工厂模式**:了解工厂模式的定义及分类(简单工厂、工厂方法、抽象工厂),并能应用于实际项目中。 - **观察者模式**:...

    常用的几种设计模式,面试必问

    - **工厂方法模式**:定义一个创建对象的接口,由子类决定实例化哪一个类,使得类的实例化推迟到子类。 - **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 **知识点3:...

Global site tag (gtag.js) - Google Analytics