• 常见设计模式: 单例模式


    单例模式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(){};
    }
    
  • 相关阅读:
    批量渲染烘焙贴图工具
    Reset textruemap _path of ZIP and copy allfiles to samepackage
    剔除数组中的相同元素
    选择样条曲线的OPEN 点
    帮朋友修改的小工具
    MAX脚本规范
    jQuery牛人
    最近在连远程的时候,粘贴数据库中数据信息时,为什么会不成功呢
    最近在连远程的时候,粘贴数据库中数据信息时,为什么会不成功呢
    Model层代码自动生成
  • 原文地址:https://www.cnblogs.com/fortitude/p/6772563.html
Copyright © 2020-2023  润新知