单例模式

  单例模式(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同步锁。静态代码中的锁是该类所属的字节码对象,同时延迟加载导致创建实例较慢,所以采用双重判断提高效率。


posted @ 2019-10-24 23:25  寻找的路上  阅读(178)  评论(0编辑  收藏  举报