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. 枚举式


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

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

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

使用场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值