美文网首页
单例模式的理解

单例模式的理解

作者: ccUpUp | 来源:发表于2019-02-20 10:24 被阅读0次

单例设计模式:

某个类在整个系统中只能有一个实例,对象可被获取和使用的代码模式。
例如:代表jvm运行环)境的Runtime类
单例模式共有的特点:1)构造器私有化 2) 有个静态变量去保存 3)提供方法区获取这个变量

单例模式分为懒汉式和饿汉式。下面分别介绍懒汉式和饿汉式的几种写法。

饿汉式第一种(jdk1.5之前):

public class Singleton1 {

    public final static Singleton1 INSTANCE = new Singleton1();
    private Singleton1(){
    }
}

我们可以直接使用Singleton1.INSTANCE 就可以获取到这个单例对象。

饿汉式第二种(jdk1.5之后),枚举:

public enum Singleton2 {
    INSTANCE;
}

我们可以直接使用Singleton2.INSTANCE 就可以获取到这个单例对象。枚举的构造器默认就为私有的,所以满足我们的条件。

饿汉式第三种,使用静态代码块初始化

public class Singleton3 {

    public final  static Singleton3 INSTANCE;
    private   String info;
    static {
        Properties properties = new Properties();
        try {
            properties.load(Singleton3.class.getClassLoader().getResourceAsStream("info.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

         String mStr  = (String) properties.get("info");
        INSTANCE = new Singleton3();
        INSTANCE.setInfo(mStr);
    }
    private Singleton3(){

    }
    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return super.toString();
    }
}

这种适用于有些变量需要在单例对象前初始化。
饿汉式不涉及到线程安全问题,因为饿汉式都是在类初始化的时候初始化类变量,类加载机制可以避免线程安全问题。

懒汉式(延迟加载)

懒汉式第一种(线程不安全):

public class Singleton4 {

    private static  Singleton4 instance ;

    private Singleton4(){

    }
    public static Singleton4 getInstance(){
        if (instance == null){
          instance = new Singleton4();
        }
        return instance;
    }
}

调用类的getInstance方法即可获取到单例对象。
懒汉式第二种(线程安全):

public class Singleton5 {

    private static Singleton5 instance ;

    private Singleton5(){

    }
    public static Singleton5 getInstance(){
        if (instance == null){
            synchronized (Singleton5.class){
                if (instance == null){
                    instance = new Singleton5();
                }
            }
        }
        return instance;
    }
}

为代码块加上同步锁,来保证线程安全。
懒汉式第三种(线程安全,使用内部类)

/*
 * 在内部类被加载和初始化时,才创建INSTANCE实例对象
 * 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的。
 * 因为是在内部类加载和初始化时,创建的,因此是线程安全的
 */
public class Singleton6 {
    private Singleton6(){

    }
    private static class Inner{
        private static final Singleton6 INSTANCE = new Singleton6();
    }
    public static Singleton6 getInstance(){
        return Inner.INSTANCE;
    }
}

这种方法看起来代码更为简洁,且利用类加载机制来保证了线程的安全。

相关文章

  • python之理解单例模式

    python之理解单例模式 1、单例模式 单例模式(Singleton Pattern)是一种常见的软件设计模式,...

  • Java四种单例设计模式

    Java中的四种单例模式 单例模式是最容易理解的设计模式之一,介绍Java中单例模式的四种写法。 1.基本单例模式...

  • Go语言设计模式(1)单例模式

    Go语言设计模式(1)单例模式 单例模式的定义 个人认为单例模式是23种设计模式中最简单也最好理解的一种,定义如下...

  • 单例模式

    单例设计模式是几种设计模式中比较容易理解的,手写单例模式也是面试频繁问到的。下面总结一下单例模式的几种写法: //...

  • 【Java】设计模式 —— 深入浅出单例模式

    学习笔记 参考:深入浅出单实例SINGLETON设计模式单例模式【Java】设计模式:深入理解单例模式 场景:一般...

  • java单例模式(推荐)

    单例模式有许多写法,可以结合自己理解选择一个自己喜欢的 引入一个其他人的博客关于单例的不错总结; 单例 单例模式 ...

  • 单例模式

    一、单例模式介绍 单例模式简而言之就是只有一个实例化对象的类,初学者可以通过单例 模式的设计更好的理解面向...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 单例模式详解

    单例模式是最常用的设计模式之一,不管是工作中,还是面试中,单例模式一直都是宠儿。单例模式看似简单,但是如果深入理解...

网友评论

      本文标题:单例模式的理解

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