javase面试题:单例设计模式(代码片段)

sunyanblog sunyanblog     2023-04-03     331

关键词:

JavaSE面试题:单例设计模式

编程题:写一个Singleton示例


什么是Singleton?

Singleton:在 Java中指单例设计模式。

单例模式:即某个类在整个系统中只有一个实例对象可被获取和使用的代码模式。

例如:代表JVM运行环境的Runtime类

要点

  • 单例类只能有一个实例。

    • 构造函数私有化
  • 单例类必须自己创建自己的唯一实例。

    • 含有一个该类的静态变量来保存这个唯一实例
  • 单例类必须给所有其他对象提供这一实例。

    • 对外提供获取该实例对象的方式

      (1)直接暴露;(2)用静态变量的get方法获取

单例模式常见的形式

  • 饿汉式:直接创建对象,不存在线程安全的问题
    • 直接实例化饿汉式(简洁直观)
    • 枚举式(最简洁)
    • 静态代码块饿汉式(适合复杂实例化)
  • 懒汉式:延迟创建对象
    • 线程不安全 (适合单线程)
    • 线程安全(适合多线程)
    • 静态内部类形式(适合多线程)

饿汉式

(1) 直接实例化饿汉式

package com.sunyan.interview.single;

/**
 * 饿汉式:直接创建实例对象,不管是否需要这个对象都会创建
 * 
 * 1.构造器私有化
 * 2.自行创建,并且用静态变量保存
 * 3.向外提供这个实例
 * 4.强调这是一个单例,可以用final修饰
 */
public class Singleton1 
    
    public static final Singleton1 INSTANCE = new Singleton1();
    
    private Singleton1() 
        
    


(2)枚举式

package com.sunyan.interview.single;

/**
 * 枚举类型:表示该类型的对象是有限的几个
 * 可以限定为一个,就成了单例
 */
public enum Singleton2 
    INSTANCE;

(3) 静态代码块

public class Singleton3 

    public static final Singleton3 INSTANCE;

    private String info;

    static 
        try 
            Properties properties = new Properties();
            properties.load(Singleton3.class.getClassLoader().getResourceAsStream("single.properties"));
            INSTANCE = new Singleton3(properties.getProperty("info"));
         catch (IOException e) 
            throw new RuntimeException(e);
        
    

    public Singleton3(String info) 
        this.info = info;
    

    ......
        

single.properties文件

info=aaaa

测试

    @Test
    public void test1() 
        Singleton3 instance = Singleton3.INSTANCE;
        System.out.println(instance);
    
技术图片

src/main/java:里面的java文件只能直接加载src/main/resources下的资源,不能直接加src/test/resources下的资源;
src/test/java: 里面的java文件既能加载src/test/resources下的资源,又能加载src/main/resources下的资源,当两个resources下都有要加载的同名资源时候,优先选择src/test/java下的资源.


懒汉式

(1)线程不安全

package com.sunyan.interview.single;

/**
 * 懒汉式:延迟创建这个实例对象
 * 
 * 1.构造器私有化
 * 2.用一个静态变量保存这个唯一实例
 * 3.提供一个静态方法,获取这个实例对象
 */
public class Singleton4 
    
    private static Singleton4 instance;
    
    private Singleton4()
    
    public static Singleton4 getInstance()
        if (instance == null)
             instance = new Singleton4();
        
        return instance;
    


(2) 线程安全

public class Singleton5 

    private static Singleton5 instance;

    private Singleton5() 
    

    public static Singleton5 getInstance() 
        if (instance == null) 
            synchronized (Singleton5.class) 
                if (instance == null) 
                    try 
                        Thread.sleep(100);
                     catch (InterruptedException e) 
                        e.printStackTrace();
                    
                    instance = new Singleton5();
                
            
        
        return instance;
    


(3)静态内部类 线程安全

package com.sunyan.interview.single;

/**
 * 懒汉式:延迟创建这个实例对象
 * 在内部类被加载和初始化时,才创建INSTANCE实例对象
 * 静态内部类不会自动随着外部类的加载和初始化而初始化,他是单独加载和初始化的
 * 因为是在内部类加载和初始化时,创建的,所以是线程安全的
 */
public class Singleton6 

    private Singleton6() 
    

    private static class Inner 
        private static final Singleton6 INSTANCE = new Singleton6();
    

    public static Singleton6 getInstance() 
        return Inner.INSTANCE;
    

静态内部类不会自动随着外部类的加载而初始化

总结

  • 饿汉式,枚举形式最简单
  • 懒汉式,静态内部类形式最简单


考点

懒汉式

笔试:请写一个延迟加载的单例设计模式示例

//懒汉式
class Single 
       private static Single s = null;
       private Single() 
       
       public static Single getInstance() 
             if (s == null) 
                    synchronized(Single.class) 
                          if (s == null) 
                                 s = new Single();
                          
                    
             
             return s;
       

面试:

懒汉式和饿汉式有什么不同?

答:懒汉式的特点是实例的延迟加载。

懒汉式延迟加载有没有问题?

答:有。如果多线程访问时会出现安全问题。

怎么解决?

答:可以加同步来解决。加同步的方式,用同步代码块和同步函授都行,但是稍微有些低效。用双重判断的形式能解决效率问题。

加同步的时候,使用的锁是哪一个?

答:该类所属的字节码文件对象。

package com.sun.thread;
/**
 * 单例设计模式。
 * @author Sun
 *
 */
//饿汉式
/*
class Single 
       private static final Single s = null;
       private Single()
       public static Single getInstance() 
             return s;
       

*/
//懒汉式
class Single 
       private static Single s = null;
       private Single() 
       
       public static Single getInstance() 
             if (s == null) 
                    synchronized(Single.class) 
                          if (s == null) 
                                 s = new Single();
                          
                    
             
             return s;
       

java面试题单例设计模式(代码片段)

单例设计模式  某个类必须只有一个实例(构造器私有化)类必须自行创建实例(含有一个该类的静态变量存储该实例)类自行向其他类提供这个实例 (对外提供获取该实例对象的方式) 饿汉式    ... 查看详情

面试阿里,字节跳动,腾讯90%会被问到的面试题——单例模式(代码片段)

1.什么是Singleton?Singleton,即单例,在Java中表示的是单例模式,所谓的单例模式,指的就是在程序中,有且仅有一个该实例对象。单:唯一,单独。例:实例对象。2.单例模式有几种创建方式?2.1饿汉式(在程序启动过程中,就... 查看详情

面试题1(代码片段)

1.单例模式  单例模式23种设计模式中最简单最常用最常考的一种模式 一个类只能有一个实例classTeacher:flag=Nonedef__new__(cls,*args,**kwargs):ifcls.flagisNone:cls.flag=object.__new__(cls)#这一句话只能走一次returncls.flagdef__init__(self,name):self. 查看详情

面试阿里,字节跳动,腾讯90%会被问到的面试题——单例模式(代码片段)

1.什么是Singleton?Singleton,即单例,在Java中表示的是单例模式,所谓的单例模式,指的就是在程序中,有且仅有一个该实例对象。单:唯一,单独。例:实例对象。2.单例模式有几种创建方式?2.1饿汉式(在程序启动过程中,就... 查看详情

java面试题汇总五(代码片段)

------------恢复内容开始------------第四部分JavaSE基础4.1设计模式和常用的设计模式 4.1.1 设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的,可以解决特定问题的设计方案。提供一个方法获取该实例... 查看详情

spring中单例多例面试题分析(代码片段)

面试题1.Spring是单例还是多例,怎么修改?Spring的bean默认是单例的(sigleton)可以修改为多例(prototype),在此bean节点中添加一个属性,scope="prototype";例如<beanid="xxx"class="全类名"scope="prototype"></bean><?xmlversion="1.0"encoding="UTF-8"... 查看详情

spring和mybaits一些常见的面试题(代码片段)

Spring的使用的几种模式:单例模式SpringBean的默认为单例模式,scope=“singleton”,这个是spring默认的。包括:饿汉模式和懒汉模式饿汉代码实现:publicclassHungryManpublicstaticHugnryManhungryman=newHungryMan();privateHu 查看详情

我是如何用单例模式征服面试官的?(代码片段)

前言单例模式无论在我们面试,还是日常工作中,都会面对的问题。但很多单例模式的细节,值得我们深入探索一下。这篇文章透过单例模式,串联了多方面基础知识,非常值得一读。最近无意间获得一份BAT... 查看详情

007期javase面试题:异常(代码片段)

开篇介绍大家好,我是Java最全面试题库的提裤姐,今天这篇是面试系列的第七篇,主要总结了JavaSE中异常类相关面试题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以... 查看详情

python经典面试题:想找工作?这些面试题你会了吗?(代码片段)

...什么?你要去找工作?先别急着找工作,先把下面的python面试题先给看了吧,不然你就只是去面试而不是找工作。话说不打没准备的仗,下面这些基本的面试题都不会你怎么可能找到工作呢?还是先把下面的东西?1、Python如何实... 查看详情

我向面试官讲解了单例模式,他对我竖起了大拇指(代码片段)

...,甚至也写过不少了,在面试中也是考得最多的其中一个设计模式,面试官常常会要求写出两种类型的单例模式并且解释其原理,废话不多说,我们开始学习如何很好地回答这一道面试题吧。什么是单例模式面试官问什么是单例... 查看详情

005期javase面试题:string类(代码片段)

开篇介绍大家好,我是Java最全面试题库的提裤姐,本篇文章是面试系列文章的第五篇,主要介绍了JavaSE中String相关的面试题,在之后会顺着开篇的思维导图一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着... 查看详情

javase面试题——方法的参数传递机制(代码片段)

1.Go!!!以下代码的运行结果是:👇👇👇importjava.util.Arrays;classMyData inta=10;publicclassExam publicstaticvoidmain(String[]args) inti=1; Stringstr&# 查看详情

android面试题整理(代码片段)

你知道什么是单例模式么?如何创建一个单例模式?双重校验方式创建双重检测锁定(Double-CheckLocking)方案属于懒汉式,使用延时加载技术,避免类加载时任务过重和造成资源浪费,同时将synchronized关... 查看详情

java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?(代码片段)

  懒汉模式和饿汉模式:publicclassDemo//privatestaticSinglesingle=newSingle();//饿汉模式privatestaticSinglesingle2=null;//饿汉模式publicDemo()if(single2==null)//1single2=newSingle();//2在多线程环境下,代码1和代码2之间,这里会有线程安全问题,线... 查看详情

2021python基础面试题,简单好用,实践经验(代码片段)

1、请简单介绍一下Python的单例模式单例模式有以下特征:1、单例类只能有一个实例;2、必须自行创建这个实例;3、必须自行向整个系统提供这个实例。实现方法之一使用__new__方法原理:new方法执行先于init方法c... 查看详情

027期java设计模式面试题(代码片段)

...大家好,我是Java最全面试题库的提裤姐,今天这篇是Java设计模式,主要总结了设计模式相关的问题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百... 查看详情

012期javase面试题:多线程(代码片段)

开篇介绍大家好,我是Java最全面试题库的提裤姐,今天这篇是JavaSE系列的第十二篇,主要总结了Java中的多线程问题,多线程分为三篇来讲,这篇是第二篇,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果... 查看详情