一.单例设计模式介绍
1.所谓类的单列设计模式,就是采取一定的方法保证整个软件系统中,对某个类只能存在 一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)
二.单例设计模式的七种方式
1.恶汉式(静态常量)
优缺点说明:
a.这种写法比较简单,就是在类装载的时候完成实例化,避免了线程同步的问题
b.在类装载的时候完成了实例化,没有达到lazy loading的效果,如果开始至终都为使用过这个
实例,则会造成内存浪费
c.结论:这种单例模式可用,可能造成内存浪费
优缺点说明:
a.这种写法比较简单,就是在类装载的时候完成实例化,避免了线程同步的问题
b.在类装载的时候完成了实例化,没有达到lazy loading的效果,如果开始至终都为使用过这个
实例,则会造成内存浪费
c.结论:这种单例模式可用,可能造成内存浪费
优缺点说明:
a.起到了lazy loading的效果,但是只能在单例的情况下使用
b.如果在多线程的情况下,一个线程进入到了if中还没来得及new对象,另外又有其他线程进来了,
这样单例模式就会变成了多例模式,也就是线程不安全了
c.结论:在实际发开发中,不要用使用这种模式
4.懒汉式(线程安全,同步方法)
优缺点说明:
a.起到了lazy loading的效果,并且线程安全的
b.效率太低了,每个线程在获得类的实例的时候,执行getInstance方法都要进行同步,而其实这个
方法第一次实例完代码就够了,后面想要获得实例直接return就好了,方法同步效率太低
c.结论:在实际发开发中,不推荐使用这种模式
5.双重检查
优缺点说明:
a.double-Check概念是多线程常用到的,如代码中所示我们进行了两次的if(instance==null)的检查,
这样就可以保证线程安全了
b.这样实例化代码只用执行一次,后面在次访问判断if(instance==null),直接return
实例化对象,也避免了反复进行的方法同步
c.线程安全,延迟加载,效率较高
d.结论:在实际开发中,推荐这种单例设计模式
6.静态内部类
优缺点说明:
a.这种方式采用了类装载的机制,来保证初始化实例只有一个线程
b.静态内部类方式,在Singleton类装载的时候,并不会立即实例化,而是在需要实例化的时,
调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化
c.类的静态属性只会在第一次加载类的时候初始化,所以在这里JVM帮助我们保证了线程的安全性,在类进行初始化时候,别的线程是无法进入的
d.优点:避免了线程不安全,利用静态内部类实现延迟加载,效率高
e:推荐使用
优缺点说明:
a.借助jdk1.5中提供的枚举实现单例模式。不仅能避免多线程同步的问题,而且还能防止反序列化重新创造对象。
b.这种方式是Effective java作者提倡的方式
c.推荐使用
三.单例设计模式在jdk应用源码分析
1.我们jdk中,java.lang.Runtime就是经典的但例模式
2.代码分析:这里采用了饿汉式(静态常量)
四.单例模式的注意事项和细节说明
注意:
(1).单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对一些需要频繁创建销毁的对象,是使用单
例模式可以提高性能
(2).当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
(3).单例模式使用场景:需要频繁创建和销毁的对象,创建对象时耗时过多或者耗费资源过多(即,重量级对象),但又
经常用到的对象,工具类对象,频繁访问的数据库或者文件对象(比如数据源或者sesson工厂)