5种方式实现单例模式

单例模式

​ 单例模式的核心是 一个类只允许有一个实例化对象。spring对象池默认就是单例模式。如果生产环境下某类只需要也只允许有一个实例化对象就可以考虑使用单例模式。

​ 实现单例模式的策略是:构造方法私有化, 也就是外部不允许通过new的方式获取对象,而是提供一个公开的静态方法供外部获取对象。内部提供逻辑判断只会new出一个对象。而难点在于在多线程的环境下保证只会new一次对象。

种类

1. 饿汉式

  1. 饿汉式单例类
package hunger;

public class People {
	private static People people = new People();
	
	private People()  {
	}
	
	public static People getInstance(){
		return people;
	}	
}
  1. 测试
package hunger;

public class test01 {
	public static void main(String[] args) {
		System.out.println(People.getInstance());
		System.out.println(People.getInstance());
	}
}
hunger.People@6d06d69c
hunger.People@6d06d69c

饿汉式在类加载时就创建了实例化对象,线程安全,缺点是不能延迟加载

易错点是在私有构造方法中抛出异常,private static People people = new People();是无法通过编译的。


2. 懒汉式

  1. 懒汉式单例类
package lazy;

public class Lazy {
	
	private static Lazy lazy;
	
	private Lazy() {
		
	}
	
	public static synchronized Lazy getInstance(){
		if(lazy == null){
			lazy = new Lazy();
		}
		return lazy;
	}

}
  1. 测试
package lazy;

public class test01 {
	public static void main(String[] args) {
		System.out.println(Lazy.getInstance());
		System.out.println(Lazy.getInstance());
	}
}
lazy.Lazy@6d06d69c
lazy.Lazy@6d06d69c

优点是可以延迟加载,缺点是使用synchronized方法,系统开销太大


3. 双重检测锁式


4. 静态内部类式


5. 枚举式


破坏单例模式的方法及应对

反射调用调用私有构造方法


通过序列化与反序列化获得对象


使用场景

猜你喜欢

转载自blog.csdn.net/qq_32640013/article/details/94499360