单例模式分为饿汉式跟懒汉式
饿汉式:在类加载时对instance进行赋值
懒汉式:当我们用到时再对instance进行赋值
现在我们假设在多线程状态下运行懒汉式会出现什么结果呢?
发现存在不一样的单例对象。
我们可以怎么去解决这个问题呢?
对加上一个锁
我们可以清楚的看见创建的单例对象都是一样的了
但仔细想想还有什么问题?
单例模式,单例,单例,我们只需要创建一次,更多的应该是查询而非创建一个单例,而加锁之后我们的getInstance变成了同步的了,没办法异步进行,这样子的话会导致我们的运行效率降低,对不对?
正因如此,我们的双重校验锁机制诞生了
创建单例模式的方式还可以通过枚举的方式,值得注意的是枚举里同样可以有方法体喔。
但是他是比较消耗性能的
我们可以如何去破坏单例模式呢
枚举类的单例模式暂时还未研究,等学完jvm再来
如何破解其他的单例模式
①、反射机制
解决办法
设置一个Boolean对象flag,初始值为false,在创建对象时,会去检查flag是否为flase,若为false则创建对象并将flag置为true,若为true直接抛出一个异常
②、序列化
解决办法,当我们反序列化时,会检查是否序列化对象是否有readReslove方法,若有则直接返回该方法返回值,若没有则new一个新的对象并返回
就到这啦,感谢小伙伴们的阅读