单例模式的写法有多种最简单的就是懒汉式的写法,但是懒汉式的写法在多线程中会出问题。下面总结写我常用的两种写法。
1. 使用volatile 关键字声明写法
public class SignalDemo1 {
public static volatile SignalDemo1 instance;
private SignalDemo1() {
}
public static SignalDemo1 getInstance( ){
if( instance == null) {
synchronized (SignalDemo1.class) {
if (instance == null) {
instance = new SignalDemo1();
}
}
}
return instance;
}
}
这种写法的好处就是不会在多线程中调用getInstance()方法出现多实例的特殊情况。也是我经常使用的。下面的写法是 Effect Java 第一版中的单例写法,我感觉写的很巧妙。第二版中用的枚举类型,虽然代码更加精简但是不容易理解。这里以第一版的写法为主。
2. Effect Java 第一版推荐的单例模式写法
public class SingleDemo2 {
private SingleDemo2( ){
}
private static class SingleHolder{
private static finale SingleDemo2 instance = new SingleDemo2( );
}
public static SingelDemo2 getInstance ( ){
return SingleHolder.instance;
}
}
这种写法的好处是巧妙的利用了静态内部类。