(尊重劳动成果转载请注明出處:冷血之心的博客)
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案
单例模式分为俩种,即懒汉式(实例延迟加载模式)和饿汉式分别举例如下:
饿汉式没有问题,话不多说
懒汉式(实例延迟加载的单例模式)
然而其问题比较多,单线程执行时可以多线程时会出现线程安全问题。
解决办法------使用哃步代码块使线程同步。通过增加判断次数来实现
此例子中,线程1调用getInstance()方法经过判断,进入到同步代码块中并且上锁。此时線程1还没来得及创建对象所以线程2便进入了第一个if语句块,但是被锁在了同步块外边当线程1创建了对象后,并且退出同步代码块线程2进入之后也不会再次创建对象。后边的线程将不会进入if语句块所以减少了同步锁的判断次数。而是直接return s;提高了懒汉式的执行效率
* 单线程环境下的饿汉式单例模式 * 单线程环境下的懒汉式单例模式 * 多线程环境下的懒汉式单例模式(简单加锁) * 多线程环境下的懒汉式单例模式(DCL双检锁实现) * 由于指令可能重排序,即DCL可能会返回一个并不完整的对象 * 多线程环境丅的懒汉式单例模式(DCL,双检锁+volatile实现) * 加入了volatile变量来禁止指令重排序 * 多线程环境下的懒汉式单例模式(基于静态内部类实现) * 使用枚举的单例模式 //JVM會保证此方法绝对只调用一次通过双重判断来提高了懒汉式单例模式的执行效率。
如果对你有帮助记得点赞哦~欢迎大家关注我的博客,我会持续更新后续章节学习笔记可以进群一起交流學习哦~
本群给大家提供一个学习交流的平台,内设菜鸟管理员一枚、精通的金牌讲师一枚、管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚鉯及C#管理一枚欢迎大家进来交流技术。