zoukankan      html  css  js  c++  java
  • 常见设计模式: 单例模式

    单例模式Singleton

    单例模式是设计模式最简单基础的模式之一, 下面介绍几种常见的单例模式的实现方式.

    懒汉

    这种单例模式用于单线程程序设计, 当程序设计需要应用并发时,
    这种实现无法保证单例类只会被实例化一次.

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

    懒汉 + 同步区

    通过简单的同步去加锁, 就做到了线程安全, 适用于性能要求不高的场景.

    public class BasicSingleton {
        public static Singleton instance;
    
        private BasicSingleton() {}
    
        public static synchronized Singleton getInstance() {
            if (instance == null)
                instance = new Singleton();
            return instance;
        }
    }
    

    饿汉

    利用Java类的加载机制, 在加载类期间初始化一个实例, 但是
    这种实现不具备懒惰实例(lazy)的特性

    public class EagerSingleton{
        public static EagerSingleton instance = new EagerSingleton();
    
        public static getInstance(){
            return instance;
        }
    }
    

    双重检查加锁 Double-Check-Lock

    只在第一次实例化期间进行同步区加锁, 既保证了性能, 又确保线程安全.
    需要valatile关键字支持

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

    枚举

    利用枚举的特性可以实现线程安全的单例, 枚举的每个元素就是一个实例, 且每次访问的都是同一个实例.同时可以避免反序列化实例出多个对象. 但不具备延迟加载的特性了.

    这种方式代码最简单, 这也是Effective Java中推荐的方式.

    public enum EnumSingleton{
        SINGLETON;
    
        private int fields;
    
        private void foo(){};
    }
    
  • 相关阅读:
    大话设计模式笔记(十三)の状态模式
    大话设计模式笔记(十二)の抽象工厂模式
    大话设计模式笔记(十一)の观察者模式
    大话设计模式笔记(十)の建造者模式
    大话设计模式笔记(九)の外观模式
    大话设计模式笔记(八)の模板方法模式
    大话设计模式笔记(七)の原型模式
    Vue(十二):自定义指令和函数渲染
    Vue(十一):组件边界
    Vue(十):混入、插件和过滤器
  • 原文地址:https://www.cnblogs.com/fortitude/p/6772563.html
Copyright © 2011-2022 走看看