首页 > 代码库 > 单例模式之个人笔记(一)

单例模式之个人笔记(一)

概念理解:关于单例模式,顾名思义,就是单一的实例,也就是说,实例只有一个。比如一个公司只有一辆公家车,你出门开这辆车,别人出门也开这辆车,你们每次开的其实是同一辆车,车只有一辆,对应java就是,我调用的是这个实例,你调用的也是同一个实例,没有再new出新的实例,大家都用一个。

分为两类:懒汉式和饿汉式。

懒汉式:就是比较懒,只有调用的时候才会创建实例。

//懒汉模式
public class Singleton {


  private Singleton(){};  //使用private私有化,使得外部无法通过new直接得到;
  private static Singleton singleton=null; //在静态方法中使用,需要静态属性
  

  public static Singleton getInstance(){ //声明为static静态,这样就给外部提供了一种调用方式,即Singleton.getInstance()得到实例
    if(singleton == null){  //如果实例不存在就创建一个,如果存在直接返回。
      synchronized (Singleton.class) { //这里考虑了线程安全问题
        if(singleton == null){//这里需要再次验证是否存在,因为如果是两个线程在同时调用的话,第一个线程发现没有实例,然后创建一个,就在此时第二个线程也读到了Singleton==null并且正在等待线程1,那么线程1创建实例,放开锁后,线程2记录的是Singleton==null,所以他也要创建,这样冲突。
          singleton = new Singleton();
        }
      }
    }
    return singleton;
  }
}

优点:假如没用到的话,就不用创建,节省资源

缺点:用的比较多的话,耗时间,因为要判断

 

 

饿汉式:初始化的时候就创建了实例,用的时候直接拿出来方便,因为他很饿

//饿汉模式
class Singleton2{


  private Singleton2(){};
  private static Singleton2 singleton2 = new Singleton2();


  private static Singleton2 getInstance(){
    return singleton2;
  }
}

优点:1.不用考虑线程安全问题

   2.节约时间,不用每次判断

缺点:不管用不用,初始化就要创建,可能用不到而浪费资源

单例模式之个人笔记(一)