java面试题——单例模式5道常见面试题

序号链接地址
1java面试题:Redis常见面试题(实际面试有被问到)
2java面试题:Spring核心面试题(必须理解背诵)
3java面试题:集合常见面试题
4java面试题:MQ、RabbitMQ面试题(面试必问,精华版)
5java面试题:Mysql常见面试题
6java面试题:线程、线程池、锁常见的15道面试题
7java面试题:jvm常见的5道面试题
8java面试题:自定义注解常见面试题
9java面试题:单例模式5道常见面试题
10java面试题:Nacos常见面试题
11java面试题:Elasticsearch面试突击
12java面试题:springboot常见面试题(一)
13Java面试题:SpringBoot常见面试题(二)
14java面试题:HTTP的常见状态码(实际面试有被问到)
15java面试题:常见项目真实面试题(实际面试被问到)
16java面试题:项目常见面试题(单点登录、购物车)
17java面试题:适用于2-5年后端开发面试(一)
18java面试题:适用于2-5年后端开发面试(二)
19java面试题:适用于2-5年后端开发面试(三)
20java面试题:2-5年后端开发常见面试题(四)
21java面试题:2-5年经验后端开发面试记录(五)
...待更新

1、关于单例模式,谈谈你的了解吧

(1)单例模式是一种常用的设计模式,单例模式比较简单但包含了关于线程安全、内存模型、类加载机制等一些比较核心的知识点。

(2)单例模式就是在整个运行时域,一个类只有一个实例对象。

(3)为什么需要单例模式呢?因为有的类型的实例对象的创建和销毁对资源来说消耗不大,比如string,然而有的类型呢就比较复杂庞大,如果频繁的创建和销毁对象并且这些对象完全是可以复用的话,那么将会造成一些不必要的性能浪费。

(4)举个例子吧,比如我现在要写一个访问数据库的demo,而创建数据库链接对象是一个耗资源的操作并且数据库链接完全是可以复用的,那么我可以将这个对象设计成单例的,这样我只要创建一次并且重复使用这个对象就可以了,而不是每次都要去访问数据库去创建一个链接对象。


2、面试中给你一张纸,手写懒加载单例模式和线程安全的单例模式

(1)懒加载单例模式:

 (2)同时满足懒加载、线程安全和高性能的单例写法:

3、实现java单例模式的几种模式?

(1)饿汉式一静态常量方式(线程安全):

类加载时就初始化实例,避免了多线程同步问题,天然线程安全。

(2)饿汉式一静态代码块方式

(线程安全:其实就是在静态常量饿汉式实现上稍微变动了一下,将类的实例化放在了静态代码块中而已,其他没区别。

(3)懒汉式(线程不安全)

这是最基本的实现方式,第一次调用才初始化,实现了懒加载的特性。多线程场景下禁止使用,因为可能会产生多个对象,不再是单例。

(4)懒汉式(线程安全,方法上加同步锁)

线程不安全懒汉式实现上唯一不同是:获取实例的getInstance0方法上加了同步锁。保证了多线程场景下的单例。但是效率会有所折损,不过还好。

(5)双重校验锁(线程安全,效率高)

此种实现中不用每次需要获得锁,减少了获取锁和等待的事件。注意volatile关键字的使用,保证了各线程对singleton静态实例域修改的可见性。

(6)静态内部类实现单例(线程安全、效率高)

这种方式下Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有通过显式调用getInstance方法时,才会显式装载SingletonHolder类,从而实例化instance.。


4、java单例模式的基本特点?

答:持有自己类型的属性:类构造器私有:对外提供获取实例的静态方法。


5、饿汉式和懒汉式的区别?

(1)线程安全方面:饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,懒汉式本身是非线程安全的。

(2)资源加载和性能方面:饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。


  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是5Java面试题: 1. Java中什么是多态性?请给出一个例子。 答:多态性是指同一个方法名可以被不同的对象调用,从而实现不同的行为。例如,一个Animal类有一个speak()方法,Dog和Cat类都继承自Animal类并重写了speak()方法。当我们调用一个Animal类型的变量的speak()方法时,实际上会根据这个变量所引用的对象的类型来调用对应的speak()方法。例如: ``` Animal animal1 = new Dog(); animal1.speak(); // 输出 "汪汪汪!" Animal animal2 = new Cat(); animal2.speak(); // 输出 "喵喵喵!" ``` 2. Java中的final关键字有哪些用途? 答:final关键字可以用于修饰类、方法和变量,具体用途如下: - 修饰类:表示该类不能被继承。 - 修饰方法:表示该方法不能被重写。 - 修饰变量:表示该变量的值不能被修改,如果是基本类型则表示该变量的值不能被改变,如果是引用类型则表示该变量引用的对象不能被改变。 3. Java中的异常处理机制是什么?请给出一个try-catch-finally块的例子。 答:Java中的异常处理机制是指程序在遇到异常时如何处理它,通常使用try-catch-finally块来实现。try代码块中包含可能抛出异常的代码,如果在try代码块中抛出了异常,则会跳转到与之匹配的catch代码块中进行处理,finally代码块中包含一些无论是否抛出异常都需要执行的代码。 例如: ``` try { int[] arr = new int[5]; arr[10] = 3; // 抛出ArrayIndexOutOfBoundsException异常 } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组下标越界!"); } finally { System.out.println("执行finally代码块!"); } ``` 4. Java中什么是线程?如何创建一个线程? 答:线程是指程序中的一条执行路径,与其他线程并发执行。Java中可以通过继承Thread类或实现Runnable接口来创建线程。例如: ``` // 继承Thread类 class MyThread extends Thread { public void run() { System.out.println("线程运行中!"); } } // 实现Runnable接口 class MyRunnable implements Runnable { public void run() { System.out.println("线程运行中!"); } } // 创建线程 MyThread t1 = new MyThread(); t1.start(); MyRunnable r1 = new MyRunnable(); Thread t2 = new Thread(r1); t2.start(); ``` 5. Java中的HashMap和Hashtable有什么区别? 答:HashMap和Hashtable都是用于存储键值对的数据结构,但有以下区别: - 线程安全性:Hashtable是线程安全的,而HashMap不是。如果在多线程环境下使用HashMap,需要进行额外的同步处理。 - null值:Hashtable不允许键或值为null,而HashMap允许键或值为null。 - 迭代器:Hashtable的迭代器是Enumeration类型的,而HashMap的迭代器是Iterator类型的。 以上是5Java面试题,希望能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

91科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值