设计模式之单例设计模式
public class Singleton{
private static Singleton uniqueInstance;
private Singleton(){}
public static syschronized Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
为了避免在多线程的情况下的灾难,需要在getInstance()方法加上线程同步关键字。
1>使用同步,可能造成程序执行效率下降100倍。如果我们可以接受同步造成的额外负担,就可以忽略。如果不能接受,那么就有可能需要重新考虑了。
2>使用及切的方式创建实例,而不是延迟实例化的做法
public class Singleton{
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
这种方式保证了在任何线程访问uniqueInstance之前,一定创建此实例了。
过早实例化,如果空闲的存在,这也是一种资源的浪费。
3>如果性能是你关心的重点,那么可以使用 ‘双重检查加锁’ ,在getInstance()中减少使用同步(volatile只是保存主内存的变量是最新值)
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance == null){
synchronized(Sington.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
这个做法可以帮你大大地减少getInstance()的时间消耗。
在1.4及更早的版本的java中,许多jvm对于volatile关键字的实现会导致双重检查加锁的失效。如果不能使用java5及以后的版本。
就请不要使用此技巧来使用单例设计模式。