java设计模式之创建型模式-单例模式

290 阅读4分钟

一.单例设计模式介绍

1.所谓类的单列设计模式,就是采取一定的方法保证整个软件系统中,对某个类只能存在 一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

二.单例设计模式的七种方式

1.恶汉式(静态常量)

优缺点说明:
    a.这种写法比较简单,就是在类装载的时候完成实例化,避免了线程同步的问题
    b.在类装载的时候完成了实例化,没有达到lazy loading的效果,如果开始至终都为使用过这个
    实例,则会造成内存浪费
    c.结论:这种单例模式可用,可能造成内存浪费

2.恶汉式(静态代码块)

 优缺点说明:
    a.这种写法比较简单,就是在类装载的时候完成实例化,避免了线程同步的问题
    b.在类装载的时候完成了实例化,没有达到lazy loading的效果,如果开始至终都为使用过这个
    实例,则会造成内存浪费
    c.结论:这种单例模式可用,可能造成内存浪费

3.懒汉式(线程不安全)

优缺点说明:
    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:推荐使用

7.枚举

优缺点说明:
  a.借助jdk1.5中提供的枚举实现单例模式。不仅能避免多线程同步的问题,而且还能防止反序列化重新创造对象。
  b.这种方式是Effective java作者提倡的方式
  c.推荐使用

三.单例设计模式在jdk应用源码分析

1.我们jdk中,java.lang.Runtime就是经典的但例模式

2.代码分析:这里采用了饿汉式(静态常量)

四.单例模式的注意事项和细节说明

注意:

(1).单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对一些需要频繁创建销毁的对象,是使用单
    例模式可以提高性能
(2).当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
(3).单例模式使用场景:需要频繁创建和销毁的对象,创建对象时耗时过多或者耗费资源过多(即,重量级对象),但又
    经常用到的对象,工具类对象,频繁访问的数据库或者文件对象(比如数据源或者sesson工厂)