1. 懒汉单例模式

线程不安全的单例模式。

 public class Singleton {  

    private Singleton() {}  

    private static Singleton single=null;  

    public static Singleton getInstance() {  

         if (single == null) {    

             single = new Singleton();  

         }    

        return single;  

    }  

}

Singleton通过将构造方法限定为private避免了其他类通过访问构造器进行实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过静态的getInstance()方法进行访问。但在并发的情况下是可能出现这种情况,非农数据就是a线程先进入getInstance()方法在创建实例化的时候,也就是还没创建成功,b线程也进入了getInstance()方法,这个时候a线程实例还没建成功,b线程判断single为空也开始创建实例,导致会出现创建出两个实例来。

 

2. synchronized 修饰的懒汉单例模式

但并发的时候也只能一个一个排队进行getInstance()方法访问。

 

public static synchronized Singleton getInstance() {  

    if (single == null) {    

        single = new Singleton();  

    }    

    return single;  

}

3. 双重检查锁定的单例模式

在并发量高的情况下,不需要排队访问getInstance()方法,性能上会优于synchronized 修饰的懒汉单例模式。

 

public static Singleton getInstance() {  

        if (singleton == null) {    

            synchronized (Singleton.class) {    

               if (singleton == null) {    

                  singleton = new Singleton();   

               }    

            }    

        }    

        return singleton;   

    }

4. 静态内部类实现单例模式

静态内部类实现单例模式,这种方式优于上的方式,它即实现了线程安全,又省去了null的判断

 

public class Singleton {  

    private static class SingletonHolder {  

    private static final Singleton INSTANCE = new Singleton();  

    }  

    private Singleton (){}  

    public static final Singleton getInstance() {  

    return SingletonHolder.INSTANCE;  

    }  

}

5. 饿汉实现单例模式

public class Singleton {  

    private static Singleton instance = new Singleton();  

    private Singleton (){}  

    public static Singleton getInstance() {  

    return instance;  

    }  

}

6. 饿汉变种实现单例模式

public class Singleton {  

    private Singleton instance = null;  

    static {  

    instance = new Singleton();  

    }  

    private Singleton (){}  

    public static Singleton getInstance() {  

    return this.instance;  

    }  

}

7. 枚举实现单例模式

public enum EnumSingleton {  

    INSTANCE;  

    public void whateverMethod() {  

    }  

枚举其实底层是依赖Enum类实现的,这个类的成员变量都是static类型的,并且在静态代码块中实例化的,和饿汉单例模式有点像。

 

12-31 14:29