Singleton单例模式

理论

  • 只有单个实例存在,现在都由spring工厂默认实现了很少手写了
    管理器类manager
    工厂类factroy
  • 保证在内存中有1个实例
  • 8种写法
  1. 构造方法设置成私有的,别人new不了,只能通过instens

应用

饿汉式,

线程安全:class加载到内存就初始化了;
在这里插入图片描述
在这里插入图片描述
问题:用不用都会初始化

懒汉式

类初始化到内存不初始化,调用getInstance()为null在初始化
在这里插入图片描述
问题:多线程访问会有影响,第一个调用get判断为null这时候另外一个线程来了也判断为null,已经有了2个实例

  • 同一个类的同一个对象hash是不同的

加锁是在static上,所以是在类上

效率降低了
在这里插入图片描述

提高效率,加锁到方法上 线程不安全

线程不安全,因为判断和创建不在一起
在这里插入图片描述

双层判断,最完美的写法

如果JIT优化成本地代码,就会交给C处理了。会指令重排不加volatile没初始化就返回instence;
在这里插入图片描述

完美

类初始化不会加载内部类,只有调用getInstance()才会创建内部类,是jvm保证线程安全的,相同的内部类之创建1次,
在这里插入图片描述

完美中完美 枚举单例

防止线程同步、 防止反序列化(枚举类无构造方法)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值