
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
单例模式是程序员在优化系统性能的时候会经常使用的一种模式,下面我们就通过案例分析来了解一下,单例模式的实现类型与注意事项。
1、单例模式的定义
单例模式确保一个类只有一个实例,并提供一个全局访问点
2、单例模式的实现
饿汉式
static变量在类装载的时候进行初始化
多个实例的static变量会共享同一块内存区域
懒汉式
懒汉式,就是实例在用到的时候才去创建,比较“懒”
单例模式的懒汉式实现方式体现了延迟加载的思想(延迟加载也称懒加载LazyLoad,就是一开始不要加载资源或数据,等到要使用的时候才加载)
指令重排
指令重排是指在程序执行过程中,为了性能考虑,编译器和CPU可能会对指令重新排序。
Java中创建一个对象,往往包含三个过程。对于singleton=newSingleton(),这不是一个原子操作,在JVM中包含如下三个过程。
给singleton分配内存
调用Singleton的构造函数来初始化成员变量,形成实例
将singleton对象指向分配的内存空间(执行完这步singleton才是非null了)
但是,由于JVM会进行指令重排序,所以上面的二步和三步的顺序是不能保证的,终的执行顺序可能是1-2-3,也可能是1-3-2。如果是1-3-2,则在3执行完毕,2未执行之前,被另一个线程抢占了,这时instance已经是非null了(但却没有初始化),所以这个线程会直接返回instance,然后使用,那肯定就会报错了,所以要加入volatile关键字。
枚举
借助JDK5添加的枚举实现单例,不仅可以避免多线程同步问题,还能防止反序列化重新创建新的对象,但是在枚举中的其他任何方法的线程安全由程序员自己负责。还有防止上面的通过反射机制调用私用构造器。不过,由于Java1.5中才加入enum特性,所以使用的人并不多。
3、单例模式注意事项和细节
单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能
当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。