单例模式顾名思义在一个程序运行的过程中针对一个系统只允许出现一个类型实例,这个就需要程序来控制类型实例的初始化。
1.一个实例的话,那么在别处调用该类型的时候就不能轻而易举的随意初始化,比如 new一个类型实例。
2.一个实例很多时候就要求线程安全的,所以我们要设计一个线程安全的单例。
1)简单的线程安全实例模式代码为:
public class Singleton {
private Singleton(){};
private static Singleton singleTon=new Singleton();
public static Singleton getSingleton(){
return singleTon;
}
2).利用内部工厂类或者内部接口进行线程安全
class Singleton1 {
private static Singleton1 retSingleton1(){
Singleton1 singleTon1=new Singleton1();
return singleTon1;
}
public static Singleton1 getSingleton1(){
return retSingleton1();
}
}
3)简单的线程安全的实例模式代码,即简单的增加一个同步关键字:
class Singleton2 {
private Singleton2(){};
private static Singleton2 singleTon2=null;
public static synchronized Singleton2 getSingleton(){
if(singleTon2==null) singleTon2=new Singleton2();
return singleTon2;
}
}
4)利用双检查的一种线程安全的实例模式代码,可以减少同步的开销:
class Singleton3 {
private Singleton3(){};
private static Singleton3 singleTon3=null;
public static synchronized Singleton3 getSingleton(){
if(singleTon3==null)
{
synchronized(Singleton3.class){
if(singleTon3==null) singleTon3=new Singleton3();
}
}
return singleTon3;
}
}
上述四种线程安全的单例模式,前两种比较相像,后两种比较相像,第四种是在第三种的基础上进行check-lock-check而已。