java面试必备——单例模式

今天面试,本人做安卓开发,但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锁住排队,所以也不是首选,看看大学生怎么写:

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基础)