学习设计模式 - 单例模式
学习设计模式 - 单例模式
一丶定义
确保某个类只有一个实例, 而且自行实例化并向整个系统提供这个实例.(Ensure a class has only one instance, and provide a global point of access to it.)
二丶五种实现方式
1) 饿汉模式
public class Singleton1 { private static final Singleton1 instance=new Singleton1(); // 类加载时就实例化 private Singleton1(){} //私有构造函数 public static Singleton1 getInstance(){ return instance; } }
2) 懒汉模式 + synchronized同步锁
public class Singleton2 { private static Singleton2 instance=null; private Singleton2(){} //私有构造函数 public static synchronized Singleton2 getInstance(){ //每次获取单例都需要获取锁, 并发情况下性能不是很好 if(instance==null){ instance=new Singleton2(); } return instance; } }
synchronized同步锁
3) 懒汉模式 + synchronized同步锁 + 双重检查
public class Singleton3 { //volatile确保多个线程能够可以看到实例化 private volatile static Singleton3 instance=null; private Singleton3(){} //私有构造函数 public static Singleton3 getInstance(){ if(instance==null){//第一次检查 synchronized (Singleton3.class){ if(instance==null){//第二次检查 instance=new Singleton3(); } } } return instance; } }
4)l懒汉模式 + 内部类
public class Singleton4 { private Singleton4(){}// 私有构造方法 public static Singleton4 getInstance(){ return InnerSingleton.instance; } //内部类 //类在加载时, 初始化属性会收集在<clinit>方法 //多个线程调用初始化方法,会被阻塞,确保只有一个线程调用,并保证属性的可见性 private static class InnerSingleton { private static final Singleton4 instance=new Singleton4(); } }
5) 枚举单例
public enum Singleton5 { INSTANCE; public void doSomething(){ System.out.println("do something"); } }
人生没有彩排,每一天都是现场直播