单例模式的几种实现方式及优缺点
单例,就是整个程序有且仅有一个实例。
1.饿汉式
1 public class Singleton { 2 private static Singleton INSTANCE = new Singleton(); 3 private Singleton(){} 4 public static Singleton getInstance(){ 5 return INSTANCE; 6 } 7 }
饿汉模式在类加载的时候就对实例进行创建。
优点:效率高 缺点:不能延时加载(浪费资源)。
2.懒汉式
1 public class Singleton { 2 private static Singleton instance; 3 private Singleton(){} 4 public static synchronized Singleton getInstance(){ 5 if(instance == null){ 6 instance = new Singleton(); 7 } 8 return instance; 9 } 10 }
优点:延时加载 缺点:效率低。
3.双重锁模式(DCL实现单例)
1 public class Singleton { 2 private volatile static Singleton singleton; 3 private Singleton (){} 4 public static Singleton getSingleton() { 5 if (singleton == null) { 6 synchronized (Singleton.class) { 7 if (singleton == null) { 8 singleton = new Singleton(); 9 } 10 } 11 } 12 return singleton; 13 } 14 }
优点:延时加载、效率比懒汉式高
4.内部类单例
1 public class Singleton { 2 private Singleton(){ 3 } 4 public static Singleton getInstance(){ 5 return Inner.instance; 6 } 7 private static class Inner { 8 private static final Singleton instance = new Singleton(); 9 } 10 }
优点:延时加载、效率高
5.枚举单例
1 public enum Singleton { 2 INSTANCE 3 4 //doSomething 该实例支持的行为 5 6 //可以省略此方法,通过Singleton.INSTANCE进行操作 7 public static Singleton get Instance() { 8 return Singleton.INSTANCE; 9 } 10 }
优点:效率高、可以天然的防止反射和反序列化调用 缺点:不能延时加载。