【剑指Offer】面试题2:实现Singleton(单例)模式

《剑指Offer——名企面试官精讲典型编程题》

作者:何海涛


一、书上原题再现

面试题2:实现Singleton模式

题目:设计一个类,我们只能生成该类的一个实例。

 


二、涉及的知识点

 


三、解题过程

/**

*   总共有五个测试用例,分别是:

*       0懒汉式-单线程(虽说线程不安全,但是真香:节省资源、高效率)

*       1懒汉式-同步多线程(线程安全,但是不好:节省资源、低效率)

*       2对懒汉式的优化-同步多线程-双重检测(可行,节省资源,稍高效率)

*       3、饿汉式-天生线程安全(推荐使用,浪费资源、高效率)

*       4静态内部类-天生线程安全(推荐使用,浪费资源、高效率)

*/

 

完整解题代码(Java版)

由于完整代码太长,我把他放到了我的GitHub里面了:

https://github.com/littlecurl/CodingInterviews/blob/master/singleton/src/com/interviewcodes/singleton/Singleton.java

 


四、调试步骤

使用MyEclipse进行调试

下图为懒汉单线程运行50次,一单出现多线程就会出现多个对象,从而失去单例模式的作用:

 

    下图为懒汉双重检测线程运行50次,始终为同一个对象,懒汉式多线程、饿汉式和静态内部类同理:

 

下图是我做的一些时间记录:

由上图可以看出:

  • 如果不要求线程安全,那么单纯的懒汉模式是真香,即不会提前生成对象占用资源,与不会跑太长时间。
  • 如果要去线程安全,那么推荐使用饿汉模式和静态内部类模式,原因就是既能保证同步又有较高的时间效率。

 

另外,在JDK源码里,有一个类叫Runtime,它就实现了单例模式,这个类的位置在:

 

这个类反正我是从来没有用过,具体用法可以参考博客园huhx的文章《java基础--àRuntime类的使用》:https://www.cnblogs.com/huhx/p/baseusejavaruntime1.html

 


五、总结

单例模式首先需要知道的是定义,然后就是如何手写出来十几行代码,当然,五种情况都写的话,那就是手写五六十行代码了。

至于实际应用,实际应用就是锻炼思维了,真正代码里面不怎么用。

 


六、声明与致谢

本题源代码请移步《剑指Offer》作者何海涛的GitHubhttps://github.com/zhedahht/CodingInterviewChinese2

      

参考文章:(每篇文章我都会去点赞https://i-blog.csdnimg.cn/blog_migrate/194e0757497c3aa2d41b59f750dbd29c.png,好的文章就应该公诸于世,大家共同学习)

  博客园:

    Andy.Zhou《你真的会写单列模式吗------Java实现》:https://www.cnblogs.com/andy-zhou/p/5363585.html#_caption_7  

  CSDN:

    Yoda_wang《搞懂设计模式:单例模式》:https://blog.csdn.net/learningcoding/article/details/80471475?utm_source=blogxgwz3#commentBox

    炸斯特《java设计模式之单列模式》:https://blog.csdn.net/jason0539/article/details/23297037?utm_source=blogxgwz0

    Mlinge-奋斗吧《高并发下线程安全的单列模式(最全最经典)》:https://blog.csdn.net/cselmu9/article/details/51366946

    

                   孙海友《JDK设计模式之——单列模式(Singleton)》:

http://770736680.iteye.com/blog/2035740

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值