java面试必备——单例模式
2016-04-28 22:52
447 查看
今天面试,本人做安卓开发,但java基础一般,半路出家的水平,死在java上了,从今天起,坚持更新博客,把我自己遇到的问题记录下来。单例模式其实很多开源的源码中都能看见,但是不一定会引起重视,今天好还研究下,网上大把多的例子。
另外回忆一下面试java知识点:
1、单例模式
2、多线程同步;
3、Arraylist和linklist的区别;
4、hashmap
5、protect、默认类作用域;
6、还有一个记得不是很清楚的问题:第三方库类中,有一个私有方法,就是想引用它,怎么办?大致是这个意思,具体忘了。。没答上来,有知道他想问什么的,麻烦留个言。(猜测和反射相关,然而我连反射是干什么都不知道。。)
===========================================正题开始===========================================================================
单例模式:
public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { return instance = new Singleton(); } }
这只是小学生水平,俗称饿汉法,然而我今天就记住这一个了,还是平时写的太少了,下面看中学生水平的怎么写:
public class Singleton { private static Singleton singleton = null; private Singleton(){} public static Singleton getSingleton() { if(singleton == null) singleton = new Singleton(); return singleton; } }
很明显,没有考虑到线程安全问题,还是不行的,看看高中生怎么写:
public class Singleton { private static Singleton instance = null; public synchronized static Singleton getInstanc() { if (instance == null) { return instance = new Singleton(); } return instance; } }的确做到了线程安全,但是效率太低,如果高并发访问,多线程会被synchronized锁住排队,所以也不是首选,看看大学生怎么写:
<pre name="code" class="java">public class Singleton { private static volatile Singleton instance = null; private Singleton() {} public static Singleton getInstanc() { if (instance == null) { synchronized(Singleton.class){ if(instance == null) { return instance = new Singleton(); } } } return instance; } }
我之前一直以为这是最好的单例模式,但是今天搜索了下网络上的文章,其实实现单例模式这个并不是最好的,因为这个受限于jdk版本,和volatile关键字有关,详情可自己百度。
硕士研究生写法:
public class Singleton { private static class Holder { private static Singleton singleton = new Singleton(); } private Singleton(){} public static Singleton getSingleton(){ return Holder.singleton; } }
明显是利用了内部静态类只加载一次的特性,但是据说还是优缺点。。。
博士研究生写法:
public enum Singleton { INSTANCE; private String name; public String getName(){ return name; } public void setName(String name){ this.name = name; } }
这种写法我也是从别处看来,并不知其精妙,哪位大神指点一二,不胜感激。
恭候院士写法:
1. 2. 3.
总结单例模式实现步骤:
1、定义一个私有构造器;
2、volatile定义一个静态实例,初始化为空;
3、双锁检查模式,因为单例模式实际工作中,new的机会并不多,双锁因此提高了并发性;
补充:至于静态内部类和枚举方式,看个人能力。。。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序