单例模式
单例模式Singleton是一种创建型模式,指某个采用Singleton单例模式,则这个类在同一个
JVM上,只能产生一个实例供外部访问,并且仅提供一个全局的访问方式。
懒汉式
懒汉式线程不安全
            
            
              java
              
              
            
          
          public class Singleton1 {
	private static Singleton1 instance;
	
	// 构造方法私有化!!!
	private Singleton1() {};
	
	public static Singleton1 getInstance() {
		if(instance == null) {
			instance = new Singleton1();
		}
		return instance;
	}
}饿汉式
饿汉式线程安全
            
            
              java
              
              
            
          
          public class Singleton2 {
	private static final Singleton2 instance = new Singleton2();
	// 构造方法私有化
	private Singleton2() {};
	public static Singleton2 getInstance() {
		return instance;
	}
}线程安全的单例模式
- 饿汉式线程安全
- 全局锁线程安全
- 静态代码块创建单例对象线程安全
- 双重校验锁实现线程安全
- 静态内部类实现线程安全的单例模式
- 内部枚举类实现线程安全
- 
全局锁 javapublic class Singleton3 { private static Singleton3 instance; // 构造方法私有化 private Singleton3() {}; // 通过synchronized添加全局锁实现线程安全 public static synchronized Singleton3 getInstance() { if (instance == null) { instance = new Singleton3(); } return instance; } }
- 
静态代码块 javapublic class Singleton4 { private static final Singleton4 instance; // 静态代码块创建单例对象 static { instance = new Singleton4(); } // 构造方法私有化 private Singleton4(){} public static Singleton4 getInstance() { return instance; } }
- 
双重校验锁 javapublic class Singleton5 { private static Singleton5 instance; private Singleton5() { } public static Singleton5 getInstance() { if (instance == null) { synchronized (Singleton5.class) { if (instance == null) { instance = new Singleton5(); } } } return instance; } }
- 
静态内部类 javapublic class Singleton6 { // 构造方法私有化 private Singleton6() {}; // 静态内部类 private static class SingletonHolder{ // 创建单例对象 private static Singleton6 instance = new Singleton6(); } public static Singleton6 getInstance() { return Singleton6.SingletonHolder.instance; } }
- 
静态枚举类 javapublic class Singleton7 { private Singleton7() {} // 内部枚举类 enum SingletonEnum{ INSTANCE; // 单例对象 private Singleton7 instance; private SingletonEnum() { instance = new Singleton7(); } private static Singleton7 getInstance() { return SingletonEnum.INSTANCE.instance; } } }