您的位置:首页 > 职场人生

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的机会并不多,双锁因此提高了并发性;

补充:至于静态内部类和枚举方式,看个人能力。。。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息