我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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对象一直占用着这段内存。

懒汉与饿汉式如何选择?

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

总结

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中常见的几种单例模式

这篇文章主要为大家展示了“java中常见的几种单例模式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中常见的几种单例模式”这篇文章吧。  单例模式:是一种常用的软件设计模式,在它的核心结
2023-06-19

Java单例模式的常见写法有哪些

这篇文章主要介绍“Java单例模式的常见写法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java单例模式的常见写法有哪些”文章能帮助大家解决问题。1.饿汉模式饿汉模式也叫预加载模式,它是在类
2023-06-30

Java 单例模式线程安全问题

Java 单例模式线程安全问题SpringIOC容器默认提供bean的访问作用域是单例模式。即在整个application生命周期中,只有一个instance。因此在多线程并发下,会有线程安全风险。我们在MVC框架下的servlet就是线程
2023-05-31

Java设计模式-单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供
2023-06-05

java单例模式解决了哪些问题

Java单例模式解决了以下问题:限制了类的实例化,保证一个类只有一个实例。这样可以节省系统资源,提高性能。提供了对类实例的全局访问点。这样可以方便地在系统中的任何地方访问该实例。保证了对象的唯一性。由于单例模式只允许一个实例存在,所以可以确
2023-10-20

PHP设计模式:常见问题解答

php 设计模式主要用于解决常见编程问题,包含以下解决方案:观察者模式:通过分离对象和事件,实现松耦合。单例模式:确保一个类只有一个实例。策略模式:通过交换算法,实现可扩展性。PHP 设计模式:常见问题解答简介设计模式是可重用的软件解决
PHP设计模式:常见问题解答
2024-05-13

常见的Java面试问题

JVMJava虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码?采用字节码的好处是什么?在 Java 中
2023-06-03

java设计模式之单例模式解析

单例模式是最简单但同时也是很重要的一种设计模式,优点有以下几个方面:1.当内存占用特别大的类需要频繁地创建销毁时,单例模式可以节省内存和提高性能,例如myBatis里面的sessionFactory2.当需要对文件做单一读写时,例如同一时间
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录