美文网首页
Singleton单例模式详解

Singleton单例模式详解

作者: 玄冰0825 | 来源:发表于2019-03-06 11:45 被阅读0次

饿汉式

直接创建实例对象,不管是否需要这个对象,都会创建,线程安全

  • 直接实例化
/**
 * @Author: daimengying
 * @Date: 2019/3/6 09:12
 * @Description:饿汉式
 *
 * 构造器私有
 * 自动创建对象,用静态变量保存
 * 对外提供实例
 */
public class Singleton1 {
    public static final Singleton1 INSTANCE=new Singleton1();
    private Singleton1(){

    }

}
  • 枚举
/**
 * @Author: daimengying
 * @Date: 2019/3/6 09:20
 * @Description:枚举类型:有限的对象
 * 枚举类的构造器都是私有
 */
public enum Singleton2 {
    INSTANCE
}
  • 静态代码块
import java.time.Duration;
import java.time.Instant;

/**
 * @Author: daimengying
 * @Date: 2019/3/6 09:20
 * @Description:静态代码块
 */
public class Singleton3 {
    public static final Singleton3 INSTANCE;
    static{
        Instant statTime = Instant.now();  //当前的时间
        INSTANCE=new Singleton3();
        System.out.println("单例加载时长:"+ Duration.between(statTime, Instant.now()).toMillis());
    }
    private Singleton3(){

    }
}

懒汉式

/**
 * @Author: daimengying
 * @Date: 2019/3/6 09:20
 * @Description:懒汉式,double check,线程安全
 */
public class Singleton4 {
    private static  Singleton4 instance;
    private Singleton4(){

    }

    public static Singleton4 getInstance(){
        if(instance==null){
            synchronized (Singleton4.class){
                if(instance==null){
                    instance=new Singleton4();
                }
            }
        }
        return instance;
    }
}
/**
 * @Author: daimengying
 * @Date: 2019/3/6 09:20
 * @Description:懒汉式,静态内部类形式
 *
 * 静态内部类不会自动随着外部类的加载和初始化而初始化,需要单独调用加载
 * 因为是在内部类中加载和初始化,因此是线程安全的
 */
public class Singleton5 {
    private Singleton5(){

    }

   private static class Inner{
       private static final Singleton5 INSTANCE=new Singleton5();
   }

   public static Singleton5 getInstance(){
        return Inner.INSTANCE;
   }
}

相关文章

网友评论

      本文标题:Singleton单例模式详解

      本文链接:https://www.haomeiwen.com/subject/inltpqtx.html