懒汉模式
public class Singleton{
private Singleton singleton = null;
private Singleton(){
}
public Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}else{
return singleton;
}
}
}
上述只适用于单线程环境,问题在于线程不是安全的。要线程安全,在getInstance前面加上synchronized关键字即可,但是如果只做一次判断,开销太大,效率不高,可以用到下面的方法
双重校验锁实现单例模式(线程安全)
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
//先判断对象是否已经实例过,没有实例化过才进入加锁代码
if (uniqueInstance == null) {
//类对象加锁
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
饿汉模式
public class Singleton{
private Singleton singleton = new Singleton();
private Singleton(){
}
public Singleton getInstance(){
return singleton;
}
}
静态内部类
public class Singleton(){
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}