1、懒汉模式把getInstance()方法变成同步方法
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
这种方法会影响性能,因为只有在第一次执行getInstance()时,才需要真正的同步,之后每次调用,使用同步都是一种累赘。
2、使用饿汉模式
public class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){}
public static synchronized Singleton getInstance(){
return singleton;
}
}
使用饿汉模式会在JVM加载这个类的时候马上创建实例。这种方法使用在,应用程序总是会创建并使用实例,或是创建和使用这个实例不会有太多负担的情况。
3、懒汉模式使用双重锁
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
这样只有在第一次创建实例的时候,同步锁才会发挥作用。
volatile关键词确保,当singleton变量被初始化实例时,多个线程能正确的处理singleton变量。详见:http://www.importnew.com/18126.html