资讯专栏INFORMATION COLUMN

java面试题:java中的单例设计模式及两种实现方法的代码举例

dadong / 550人阅读

摘要:面试时经常会问到关于单例设计模式,因为它能考察的知识点较多且在开发中经常用到。那我就来说一说我对于单例设计模式的一些浅见。还有另一种实现方法称为懒汉式。但以上代码会出现线程安全问题。

Java面试时经常会问到关于单例设计模式,因为它能考察的知识点较多且在开发中经常用到。
那我就来说一说我对于单例设计模式的一些浅见。
首先,在Java中,什么是单例呢?
就是保证类在内存中只有一个对象。
那么问题来了,如何才能保证类在内存中只有一个对象呢?
A:把构造方法私有化;
B:在成员变量中自己new一个类实例,并用private将其私有化且用static将其静态修饰;
C:对外提供一个静态方法返回这个对象。
依据以上的思路,就可以写出如下的代码:

public class Student{
    private Student(){}
    private static Student s=new Student();
    public static Student getStudent(){
        return s;
    }
}

以上的实现方法在业内称为”饿汉式”,可以这样理解:这个单例对象随着类的加载就被创建出来了,就像饿狼扑食一样,这里的”狼”就是单例对象,而“食”就是类加载。
还有另一种实现方法称为“懒汉式”。先看代码实现:

public class Student{
    private Student(){}
    private static Student s=null;
    public static Student getStudent()
    {
        if(s==null)
        {
            s=new Student();
        }
        return s;
    }
}

从代码中可以看出:这个单例对象是随着调用类的静态方法才被被创建的,并不是随着类的加载而被创建,所以它要滞后于类加载,故称为“懒汉式”。
但以上代码会出现线程安全问题。
那就让我来分析一下为什么会出现线程安全问题
判断是否会出现线程安全问题必须满足一下三个条件,缺一不可:
A:是否为多线程环境;
B:是否有共享数据;
C:是否有多条语句操作共享数据

那我就按这三个条件分析以上代码:
A是有可能的
B共享数据就是 Student对象
C
if(t==null){
t=new Teacher();
}
这里有两条语句在操作共享数据
那么问题又来了,如何解决线程安全问题呢?
加锁
而加锁又有两种实现方法:1.同步代码块;2.同步方法
显然对以上代码而言,同步方法是个简洁明了的。所以修改后的代码如下:

public class Student{
    private Student(){}
    private static Student s=null;
    public static synchronized Student getStudent(){
        if(s==null)
        {
            s=new Student();
        }
        return s;
    }
}

那么,这两种单例实现代码的应用场景是什么呢?

答案:开发一般用“饿汉式”,因为它不会出现问题且代码简单,面试时用“懒汉式”,因为它不仅考察了单例模式实现,还考察了线程安全。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66264.html

相关文章

  • Spring IOC知识点一网打尽!

    摘要:使用的好处知乎的回答不用自己组装,拿来就用。统一配置,便于修改。 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总的来说还是非常值得的! 本来想的是刷完《Spring 实战 (第4版)》和《精通Spring4.x 企业应用开发实战》...

    djfml 评论0 收藏0
  • 手撕面试官系列(二):开源框架面试Spring+SpringMVC+MyBatis

    摘要:跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来期间也没有准备充分,到底是因为技术原因影响自己的发展,偏移自己规划的轨迹,还是钱给少了,不受重视。 跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技...

    Flink_China 评论0 收藏0
  • 手撕面试官系列(五):Tomcat+Mysql+设计模式面试

    摘要:面试题答案领取方式见主页的缺省端口是多少,怎么修改有哪几种运行模式优化有几种部署方式容器是如何创建类实例用到了什么原理如何优化内存怎样调优垃圾回收怎样策略调优怎样共享处理怎样添加远程监控专业点的分析工具有哪些关于的数目怎样监视的内存使用情况 TomcatshowImg(https://segmentfault.com/img/remote/1460000019788819);(面试题+...

    GraphQuery 评论0 收藏0

发表评论

0条评论

dadong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<