单例模式

单例模式思想:构造器私有

饿汉式:在加载的时候就实例化 容易造成资源的浪费

//饿汉式单例
public class Hungry {

	private Hungry() {
		
	}
	
	private final static Hungry HUNGRY = new Hungry();
	
	public static Hungry getInstance() {
		return HUNGRY;
	}
	
}

懒汉式:线程不安全

//懒汉式单例
public class LazyMan {

	private LazyMan() {
		
	}
	
	private static LazyMan lazyMan;
	
	public LazyMan getInstance() {
		if(lazyMan==null) {
			lazyMan = new LazyMan();
		}
		return lazyMan;
	}
	
	
}

DCL懒汉式:还是有问题指令重排导致出错

//懒汉式单例
public class LazyMan {

	private LazyMan() {
		
	}
	
	private static LazyMan lazyMan;
	
	// 双重检测锁模式 懒汉式单例 DCL懒汉式
	public LazyMan getInstance() {
		if(lazyMan==null) {
			synchronized (LazyMan.class) {
				if(lazyMan==null) {
					lazyMan = new LazyMan(); // 不是原子性操作
					/*
					 *1.分配内存空间
					 *2.执行构造方法,初始化对象
					 *3.把这个对象指向这个空间
					 * 
					 * 123操作顺序
					 * 创建线程1有可能执行132顺序操作 暂时也行
					 * 但是创建线程2继续132就会报错 因为以为lazyMan!=null 会直接 return
					 * 此时lazyMan没有完成构造
					 */
				}
			}
		}
		return lazyMan; 
	}
	
	
}

DCL懒汉式+volatile:

//懒汉式单例
public class LazyMan {

	private LazyMan() {
		
	}
	
	private volatile static LazyMan lazyMan;
	
	// 双重检测锁模式 懒汉式单例 DCL懒汉式
	public LazyMan getInstance() {
		if(lazyMan==null) {
			synchronized (LazyMan.class) {
				if(lazyMan==null) {
					lazyMan = new LazyMan(); 
				}
			}
		}
		return lazyMan; 
	}
	
	
}

静态内部类:

//静态内部类
public class Holder {
	
	private Holder() {
		
	}
	
	public static Holder getInstace() {
		return InnerClass.HOLDER;
	}
	
	public static class InnerClass{
		private static final Holder HOLDER = new Holder();
	}

}

枚举:

//枚举 enum本身也是一个Class类
public enum EnumSingle {
	
	INSTANCE;
	
	public EnumSingle getInstance() {
		return INSTANCE;
	}

}

单例不安全可以通过反射进行破坏

但是反射不能破坏枚举的单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值