返回顶部
首页 > 资讯 > 后端开发 > Python >java面试常见模式问题---单例模式
  • 227
分享到

java面试常见模式问题---单例模式

2024-04-02 19:04:59 227人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1、简介2、单例模式——懒汉式3、单例模式——饿汉式总结1、简介 单例模式使⽤场景: 业务系统全局只需要⼀个对象实例,⽐如发号

1、简介

单例模式使⽤场景

  • 业务系统全局只需要⼀个对象实例,⽐如发号器、 Redis 连接对象等。
  • spring ioc容器中的 Bean 默认就是单例。
  • Spring Boot 中的 Controller、Service、Dao 层中通过 @Autowire的依赖注⼊对象默认都是单例的。

单例模式分类

  • 懒汉:就是所谓的懒加载,延迟创建对象,需要用的时候再创建对象。
  • 饿汉:与懒汉相反,提前创建对象。
  • 单例模式实现步骤:
  • 私有化构造函数
  • 提供获取单例的方法。

2、单例模式——懒汉式

单例模式——懒汉式有以下⼏种实现⽅式:



public class SingletonLazy {
    // 当需要用到该实例的时候再创建实例对象
    private static SingletonLazy instance;
    
    private SingletonLazy() {
    }
    
    public void process() {
        System.out.println("方法实例化成功!");
    }
    
    public static SingletonLazy getInstance() {
        if (instance == null) {// 实例为null时候才创建
            
            instance = new SingletonLazy();// 当需要的时候再进行实例化对象
        }
        return instance;
    }
    
    public static synchronized SingletonLazy getInstance2() {
        if (instance == null) {// 实例为null时候才创建
            // 方法上加synchronized后可以保证线程安全
            instance = new SingletonLazy();// 当需要的时候再进行实例化对象
        }
        return instance;
    }
    
    public static SingletonLazy getInstance3() {
        if (instance == null) {// 实例为null时候才创建
            // 局部加锁后可以保证线程安全,效率较高
            // 缺陷:假设线程A和线程B
            synchronized (SingletonLazy.class){
                // 当线程A获得锁的执行权的时候B等待 A执行new SingletonLazy();实例化
                // 当A线程执行完毕后,B再获得执行权,这时候还是可以实例化该对象
                instance = new SingletonLazy();// 当需要的时候再进行实例化对象
            }
        }
        return instance;
    }
}

单例模式:懒汉实现 + 双重检查锁定 + 内存模型

对于上面方式三存在的缺陷,我们可以使用双重检查锁定的方式对其进行改进



public static SingletonLazy getInstance3plus() {
    if (instance == null) {// 实例为null时候才创建
        // 局部加锁后可以保证线程安全,效率较高
        // 假设线程A和线程B 
        synchronized (SingletonLazy.class){// 第一重检查
            // 当线程A获得锁的执行权的时候B等待 A执行new SingletonLazy();实例化
            // 当A线程执行完毕后,B再获得执行权,这时候再判断instance == null是否成立
            // 如果不成立,B线程无法 实例化SingletonLazy
            if (instance == null){// 第二重检查
                instance = new SingletonLazy();// 当需要的时候再进行实例化对象
            }
        }
    }
    return instance;
}

再次升级方式三,来解决内存模型中的指令重排问题


// 添加volatile 关键字,禁止实例化对象时,内存模型中出现指令重排现象
private static volatile SingletonLazy instance;

public static SingletonLazy getInstance3plusplus() {
    if (instance == null) {// 实例为null时候才创建
        // 局部加锁后可以保证线程安全,效率较高
        // 假设线程A和线程B
        synchronized (SingletonLazy.class){// 第一重检查
            // 当线程A获得锁的执行权的时候B等待 A执行new SingletonLazy();实例化
            // 当A线程执行完毕后,B再获得执行权,这时候再判断instance == null是否成立
            // 如果不成立,B线程无法 实例化SingletonLazy
            if (instance == null){// 第二重检查
                instance = new SingletonLazy();// 当需要的时候再进行实例化对象
            }
        }
    }
    return instance;
}

单例模式——懒汉式调用:


@Test
public void testSingletonLazy(){
    SingletonLazy.getInstance().process();
}

3、单例模式——饿汉式



public class SingletonHungry {
    // 当类加载的时候就直接实例化对象
    private static SingletonHungry instance = new SingletonHungry();
    private SingletonHungry(){}
    
    public void process() {
        System.out.println("方法实例化成功!");
    }
    public static SingletonHungry getInstance(){
        return instance;// 当类加载的时候就直接实例化对象
    }
}

单例模式——饿汉式调用:


@Test
public void testSingletonHungry(){
    SingletonHungry.getInstance().process();
}

饿汉式单例模式,当类加载的时候就直接实例化对象,因此不需要考虑线程安全问题。

  • 优点:实现简单,不需要考虑线程安全问题。
  • 缺点:不管有没有使用该对象实例,instance对象一直占用着这段内存。

懒汉与饿汉式如何选择?

  • 如果对象内存占用不大,且创建不复杂,直接使用饿汉的方式即可。
  • 其他情况均采用懒汉方式(优选)。

总结

文章会不定时更新,有时候一天多更新几篇,如果帮助您复习巩固了知识点,还请支持一下,后续会亿点点的更新!希望大家多多关注编程网的其他内容!

--结束END--

本文标题: java面试常见模式问题---单例模式

本文链接: https://lsjlt.com/news/127894.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java面试常见模式问题---单例模式
    目录1、简介2、单例模式——懒汉式3、单例模式——饿汉式总结1、简介 单例模式使⽤场景: 业务系统全局只需要⼀个对象实例,⽐如发号...
    99+
    2024-04-02
  • java面试常见模式问题---代理模式
    目录1、静态代理2、动态代理面试题一:JDK动态代理和CGLIB动态代理区别?面试题二:JDK动态代理为什么只能对实现了接口的类生成代理?总结 本篇总结的是 代理设计模式,后...
    99+
    2024-04-02
  • java中常见的几种单例模式
    这篇文章主要为大家展示了“java中常见的几种单例模式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中常见的几种单例模式”这篇文章吧。  单例模式:是一种常用的软件设计模式,在它的核心结...
    99+
    2023-06-19
  • Java单例模式的几种常见写法
    目录1.饿汉模式2.懒汉模式3.静态内部类4.枚举总结1.饿汉模式 饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 Class...
    99+
    2024-04-02
  • Java 单例模式线程安全问题
    Java 单例模式线程安全问题SpringIOC容器默认提供bean的访问作用域是单例模式。即在整个application生命周期中,只有一个instance。因此在多线程并发下,会有线程安全风险。我们在MVC框架下的servlet就是线程...
    99+
    2023-05-31
    java 单例模式 线程安全
  • Java单例模式的常见写法有哪些
    这篇文章主要介绍“Java单例模式的常见写法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java单例模式的常见写法有哪些”文章能帮助大家解决问题。1.饿汉模式饿汉模式也叫预加载模式,它是在类...
    99+
    2023-06-30
  • Java设计模式-单例模式
    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供...
    99+
    2023-06-05
  • 教你java面试时如何聊单例模式
    目录NO.1 单例模式的应用场景NO.2 饿汉式单例NO.3 懒汉式单例NO.4 反射破坏单例NO.5 序列化破坏单例NO.6 注册式单例NO.7 ThreadLocal 线程单例&...
    99+
    2024-04-02
  • java单例模式解决了哪些问题
    Java单例模式解决了以下问题: 限制了类的实例化,保证一个类只有一个实例。这样可以节省系统资源,提高性能。 提供了对类实例...
    99+
    2023-10-20
    java
  • Java设计模式之单例模式
    目录什么是设计模式?单例模式是什么?单例模式设计的原则是什么?Java实现单例模式的5种方式?懒汉饿汉静态内部类双重校验锁DCL(Double Check Lock)枚举(num)总...
    99+
    2024-04-02
  • PHP设计模式:常见问题解答
    php 设计模式主要用于解决常见编程问题,包含以下解决方案:观察者模式:通过分离对象和事件,实现松耦合。单例模式:确保一个类只有一个实例。策略模式:通过交换算法,实现可扩展性。 PHP...
    99+
    2024-05-13
    php 设计模式 冒泡排序
  • 单片机面试常见问题
    1、中断的概念?简述中断的过程 (1)中断:指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,转而执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序执行完毕...
    99+
    2023-09-04
    单片机 stm32 嵌入式硬件
  • java面试常见问题---ConcurrentHashMap
    1、请你描述一下ConcurrentHashMap存储数据结构是什么样子呢? ConcurrentHashMap 内部的 map 结构和 HashMap 是一致的,都是由:...
    99+
    2024-04-02
  • 常见的Java面试问题
    JVMJava虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码采用字节码的好处是什么在 Java 中,J...
    99+
    2023-06-03
  • Java单例模式中的线程安全问题
    目录一. 使用多线程需要考虑的因素二. 单例模式1. 饿汉模式2. 懒汉模式3. 懒汉模式(使用synchronized改进)4. 懒汉模式(使用双重校验锁改进)三. volatil...
    99+
    2024-04-02
  • Java中常用的设计模式之单例模式详解
    目录注意优点缺点使用场景一、实现方式二、实现方式三、测试总结注意 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 优点...
    99+
    2024-04-02
  • 【Java】设计模式之单例模式与工厂模式
    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:JavaSE精品总结 文章目录   前言1、设计模式概念及分类2、单例模式2...
    99+
    2023-10-04
    java 单例模式 设计模式
  • Java泛型常见面试题(面试必问)
    目录1、泛型的基础概念1.1 为什么需要泛型1.2 什么是泛型2、泛型的定义和使用2.1 泛型类\泛型接口2.2 泛型方法2.3 泛型类的继承2.4 类型通配符?及其上下限1...
    99+
    2024-04-02
  • Java设计模式之单例模式简介
    目录一、饿汉式(静态常量)二、饿汉式(静态代码块)三、懒汉式(线程不安全)四、懒汉式(线程安全,同步方法)五、懒汉式(线程不安全,同步代码块)六、双重检查( DCL )七、静态内部类...
    99+
    2024-04-02
  • JAVA设计模式之单例模式详解
    目录前言一、单例模式是什么?二、懒汉式单例三、饿汉式单例四、双重校验锁总结前言 在之前的文章里已经介绍了设计模式以及设计原则的概念,接下来我们从单例模式入手深入学习几种常用的JAVA...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作