美文网首页
一.设计模式 - 单例模式

一.设计模式 - 单例模式

作者: 清光_07e4 | 来源:发表于2019-08-26 17:52 被阅读0次

什么是单例模式(Singleton Pattern)

是一种常用的软件设计模式。在应用这个模式时,单例对象的必须保证只有一个实例存在

为什么要用单例模式

节省内存空间,避免重复的创建和销毁对象,可以提高性能。

怎么样使用单例模式

一. 饿汉方式

/**
 * 饿汉模式 - 1 线程安全
 *
 * @Author: zxs
 * @Date: 2019/8/26
 */
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }

}




/**
 * 饿汉模式 - 2 线程安全
 *
 * @Author: zxs
 * @Date: 2019/8/26
 */
public class Singleton2 {

    private static Singleton2 instance;

    {
        instance = new Singleton2();
    }

    private Singleton2() {
    }

    public static Singleton2 getInstance() {
        return instance;
    }
}

饿汉模式总结
优点: 写法简单 线程安全
缺点: 类装载的时候就实例化,启动较慢.如果类没有使用过,造成内存空间浪费

二. 懒汉方式

/**
 * 懒汉模式 - 1 线程不安全
 * 
 * @Author: zxs
 * @Date: 2019/8/26
 */
public class Singleton {

    private static Singleton instance;
    private Singleton() {
    }

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

}


/**
 * 懒汉模式 - 2 线程安全
 *
 * @Author: zxs
 * @Date: 2019/8/26
 */
public class Singleton2 {

    private static Singleton2 instance;
    private Singleton2() {
    }

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

}

懒汉模式总结
优点:
启动速度快,如果没使用过这个实例,则不会初始化该实例 不会操作内存空间的浪费
缺点:
懒汉模式 - 1 多线程不安全 if(instance == null){} 会有多个线程同时进入 导致重复创建对象
懒汉模式 - 2 解决了多线程不安全问题 但是 synchronized关键字 在多线程中效率不高

三. 双重检查锁方式

/**
 * 双重检查锁
 * @Author: zxs
 * @Date: 2019/8/26
 */
public class Singleton {
    /**
     * 由于 JVM 具有指令重排的特性,在多线程环境下可能出现 singleton 已经赋值但还没初始化的情况,导致一个线程获得还没有初始化的实例。
     * volatile 关键字的作用
     * 1.保证了不同线程对这个变量进行操作时的可见性
     * 2.禁止进行指令重排序
     */
    private static volatile Singleton singleton;

    private Singleton() {
    }

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

双重检查锁总结
优点: 线程安全 延迟加载 效率较高

四.静态内部类方式


/**
 * 静态内部类写法 线程安全
 * @Author: zxs
 * @Date: 2019/8/26
 */
public class Singleton {
    private Singleton() {
    }

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

静态内部类总结
利用了类加载机制实现线程安全.当 Singleton.getInstance() 调用时候 才会实例化,不会造成内存空间浪费。

五.枚举方式

enum Singleton {
    INSTANCE;
    public void anyMethod(){}
}

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 设计模式之单例模式

    单例设计模式全解析 在学习设计模式时,单例设计模式应该是学习的第一个设计模式,单例设计模式也是“公认”最简单的设计...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 基础设计模式:单例模式+工厂模式+注册树模式

    基础设计模式:单例模式+工厂模式+注册树模式 单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象...

网友评论

      本文标题:一.设计模式 - 单例模式

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