转:再谈java单例模式[Singleton]之五种写法--双检索、枚举、线程问题
转自:http://hi.baidu.com/1039580989/blog/item/c65a1e5693c7f9d8b645ae0d.html
?
/**
?* 饿汉式单例类
?* @author wang
?*/
public class Singleton {
?private Singleton(){}
?private static Singleton instance=new Singleton();
?private static Singleton getInstance(){
??return instance;
?}
}
此方法不用考虑线程同步问题
/**
?* 懒汉式单例类
?* @author wang
?*/
public class Singleton {
?private Singleton(){}
?private static Singleton instance;
?public static synchronized Singleton getInstance(){
??if(instance==null){
???return instance=new Singleton();
??}else{
???return instance;
??}
?}
}
为了线程同步问题,加上synchronized关键字。但是效率会下降
/**
?* 内部类实现
?* @author wang
?*/
public class Singleton_Holedr {
?private Singleton_Holedr(){}
?//内部类
?private static class? SingletonHoledrContainer{
??private static Singleton_Holedr instances=new Singleton_Holedr();
?}
?
?public static Singleton_Holedr getInstances(){
??return SingletonHoledrContainer.instances;
?}
}
上面程序强制初始化了SingletonHoledr类,但如果我们还不需要使用它的该类的唯一实例,
但系统不会初始化其实内部类:SingletonHoledr
因此如果系统只有等到真正调用Singleton_Holedr的getInstances()方法时才会初始化SingletonHoledrContainer类
/**
?* 双检索单例模式
?* @author wang
?*/
public class Singleton_Lock {
?private Singleton_Lock(){}
?
?private static Singleton_Lock instances;
?private static Singleton_Lock getInstances(){
??if(instances==null){
???synchronized (Singleton_Lock.class) {//保证了同一时间只能有一个对象访问此同步块
????if(instances==null){
?????instances=new Singleton_Lock();
????}
???}?
??}
??return instances;?
?}
}
/**
?*利用枚举单例模式
?*/
public enum SingletonExample {
? INSTANCE;?
???? public static SingletonExample getInstance(){?
???????? return INSTANCE;?
???? }?
}