Java中经常要用到单例了,其实单例有几种变体版本,其中有一些细微的差别。
最常见的是这种了,如果没有并发的要求,可以将getInstance()前的synchronized去掉,否则影响性能
public class Singleton {
private static Singleton instance;
private Singleton(){
//构造方法必须是私有的
};
public static synchronized Singleton getInstance(){
if(instance==null){
return new Singleton();//如果没有同步锁,则有可能有两个线程同时进入这行代码,造成第二个实例的出现
}else{
return instance;
}
};
}
这种带同步的方式有一个问题,即——事实上只有第一执行该方法时,才真正需要同步,但这么处理每次方法调用都会用同步锁,在带来了性能下降,解决这个问题可以将实例化提前进行
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
这么着确实能保证了类加载的时候实例就创建好了,但如果实例化是开销比较大的操作的化,这样就会在不需要调用方法时也浪费了系统资源。
下面的方法只在实例未创建时用同步创建实例
public class Singleton {
private volatile static Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class) {
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
关于volatile关键字可以参考下面的博文:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html