首页 > 编程语言 >JAVA常见面试题-设计模式(单例模式实现)

JAVA常见面试题-设计模式(单例模式实现)

时间:2024-07-24 14:54:34浏览次数:14  
标签:面试题 多线程 JAVA 创建 Singleton static 单例 singleton 设计模式

单例模式分为懒汉式与饿汉式,其中饿汉式较为常用。

  • 饿汉式
public class Singleton {  

    private static Singleton instance = new Singleton();  

    private Singleton (){}  

    public static Singleton getInstance() {  

    return instance;  

    }  

}
  • 下面这种方式用于多线程

双检锁/双重校验锁(DCL,即 double-checked locking):

JDK 版本:JDK1.5 起

是否 Lazy 初始化:是

是否多线程安全:是

实现难度:较复杂

描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。

getInstance() 的性能对应用程序很关键。

public class Singleton {  

    private volatile static Singleton singleton;  

    private Singleton (){}

    public static Singleton getSingleton() {  

    if (singleton == null) {  

        synchronized (Singleton.class) {  

        if (singleton == null) {  

            singleton = new Singleton();  

        }  

        }  

    }  

    return singleton;  

    }  

}
  • 首先用volatile修饰静态私有的用于存放单例对象的变量是为了防止多线程拿到的不是最新的对象,
  • 把构建方法私有化,防止被外部被创建,
  • 在第一次if判断单例对象是否被创建时如果被创建直接返回,如果没有则需要把对象加锁之后再次判断对象是否被创建(为了防止其他线程创建)
  • 如果被创建直接返回,否则创建并返回。

标签:面试题,多线程,JAVA,创建,Singleton,static,单例,singleton,设计模式
From: https://blog.csdn.net/weixin_47720421/article/details/140662363

相关文章

  • 设计模式-代理模式(Proxy Pattern)
    设计模式-代理模式(ProxyPattern) 概要 记忆关键字:代理控制 定义:为其他对象提供一种代理以控制对这个对象的访问 分析: 1)通过代理类,给对象的行为增加辅助功能的解决方案,就是代理模式 2)在程序运行时,动态地为被代理对象生成代理类,借助编程语言当中的"反射"特性。 ......
  • JAVA笔记十四
    十四、集合1.集合概述(1)集合是存储其它对象的特殊对象,可以将集合当作一个容器(2)集合的相关接口和类位于java.util包中(3)集合中的接口和类是一个整体、一个体系2.集合接口接口定义了一组抽象方法,实现该接口的类需要实现这些抽象方法,从而实现接口的类就具备了接口所规......
  • 【数据结构】:用Java实现链表
    在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。概念顺序表是物理上连续,逻辑上也是连续的链表......
  • 设计模式-抽象工厂模式(Abstract Factory Pattern)
    设计模式-抽象工厂模式(AbstractFactoryPattern)  概要   记忆关键词:抽象接口  定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。  分析:如果待创建的产品非常多,我们不需要为每一个产品类配上一个工厂类,而是可以把这些产品进行分组。抽象......
  • 从 IFRAME javascript 到 google colab 的回调函数
    所以我在学习googlecolab时遇到了一个问题,在googlecolab中运行我的代码,我打开服务器并使用IFRAME查看我的网站,我试图解决的问题是选择json文件并单击上传时我希望该文件上传到我的笔记本本地内存,我的index.html文件有一个回调函数:<script>functionuploadJs......
  • 设计模式-建造者模式(Builder)
    设计模式-建造者模式(Builder)  概要   记忆关键词:类和构造分离  定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。  分析:原型模式就是从一个样板对象中复制出一个内部属性一致的对象。它是在内存中拷贝二进制流,比new一个对象的性能......
  • Java并发编程实战读书笔记(四)
    显示锁Lock与ReentrantLockLock接口定义了一组抽象的加锁操作,与内置加锁机制不同,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。在Lock的实现中必须提供与内部锁相同的内存可见性语义,但在加锁语义、调度算法、顺......
  • Java并发编程实战读书笔记(二)
    对象的组合在设计线程安全的类时,确保数据的一致性和防止数据竞争是至关重要的。这通常涉及三个基本要素:确定构成对象状态的所有变量,明确约束这些状态变量的不变性条件,以及建立管理对象状态并发访问的策略。要确定构成对象状态的所有变量相对简单,但需注意状态应封装在对象......
  • Java中的优先级队列(PriorityQueue)(如果想知道Java中有关优先级队列的知识点,那么只看这
        前言:优先级队列(PriorityQueue)是一种抽象数据类型,其中每个元素都关联有一个优先级,元素按照优先级顺序进行处理。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客先让我们看一下本文大致的讲解内容:目录1.优......
  • 基于Java+SpringBoot+Vue的卓越导师双选系统的设计与开发(源码+lw+部署文档+讲解等)
    文章目录前言项目背景介绍技术栈后端框架SpringBoot前端框架Vue数据库MySQL(MyStructuredQueryLanguage)具体实现截图详细视频演示系统测试系统测试目的系统功能测试系统测试结论代码参考数据库参考源码获取前言......