单例模式

徘徊边缘 提交于 2019-12-02 07:02:28

  单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

 

单例模式主要有两种实现方式:

饿汉式:

class Single{   private static final Single s = new Single();   private Single(){}   public static Single getInstance(){       return s;   }}

顾名思义,程序一运行,就会加载该类实例。  

final 关键字可加可不加,加了显得更严谨,表示处于内存中的常量池区域中;

 

懒汉式:

class Single{  private static Single s = null;  private Single(){}  public static Synchronized Single getInstance(){    if(s == null){      s = new Single();    }  }}上面是最原本的懒汉式实现方式,但是同步锁会导致多线程时,每个线程都需要判断资源是否上锁,比较低效,优化后如下:class Single{    private static Single s = null;    private Single(){}    public static  Single getInstance(){        if(s == null){            synchronized(Single.class){                if(s == null){                    s = new Single();                }            }        }        return s;    }}

顾名思义,只有程序中需要用到该类的时候,才会去new一个新的类实例。

 

两种实现方式都可以使用,只不过懒汉式包含更多的知识点,比如面试时常会问:

两种方式有什么区别?

  懒汉式采用延迟加载的方式。

多线程时懒汉式会有什么问题,如果有,该怎么解决?

  会重复创建实例,可以添加synchronize同步锁。静态代码中的锁是该类所属的字节码对象,同时延迟加载导致创建实例较慢,所以采用双重判断提高效率。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!