转:再谈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;
}
}