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

写一下单例模式,考虑线程安全与线程不安全的情况

2015-04-22 00:36 246 查看
凡是提到设计模式,面试官很喜欢问最简单的单例模式。

方法一

单例模式最简单的写法如下

public class SingletonPatternA {

private static SingletonPatternA instance = null;

private SingletonPatternA(){}

public static SingletonPatternA getInstance(){
if(instance == null)
instance = new SingletonPatternA();

return instance;
}
}


这个写法是饿汉单例模式,但也是是属于线程不安全的写法。如果多线程同时来进行getInstance的操作,那么这个时候进入if(instance == null)判断时就需要加入线程同步的方法了。

方法二

下面写一写存在线程安全的单例模式。

/**
* 单例模式 - 懒汉、线程安全
*/
public class SingletonPatternB {

private static SingletonPatternB instance;

private SingletonPatternB() {
}

// 加入synchronized,把整个方法串行执行
public static synchronized SingletonPatternB getInstance(){
if(instance == null){
instance = new SingletonPatternB();
}
return instance;
}

}


这个方法可以保证线程的同步,但是效率太低,因为大多数情况下不需要同步

方法三

上述两种方法都是懒汉单例模式,但是处理线程同步还是存有一些问题,所以参考了多种线程安全的单例模式后,我觉得下面这种比较好理解。

/**
* enum 是JDK1.5后出来的
*/
public enum SingletonPatternC {
INSTANCE;
public void PrintFunction(){
System.out.println("This is Enum Type");
};

public static void main(String[] args) {
SingletonPatternC ins = SingletonPatternC.INSTANCE;
ins.PrintFunction();
}
}

-------
This is Enum Type


这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊。1

方法四

饿汉式单例模式,本身是一种线程安全的方法,再类创建的时候,对象就生成了,所以不存在线程同步的问题。2

/**
* 饿汉式单例模式
*/
public class SingletonPatternD {
private static SingletonPatternD instance = new SingletonPatternD();

private SingletonPatternD(){
}

public SingletonPatternD getInstance(){
return instance;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单例模式 面试题