zoukankan      html  css  js  c++  java
  • 单例模式(Singleton Pattern)

    意图

    保证一个类仅有一个实例,并提供一个该实例的全局访问点

    可将一个实例扩展到n个实例。限定某类最多只能创建n个实例。

    双重锁定实现单例模式

    C#

    public sealed class Singleton
    {
        private static volatile Singleton instance = null;
        private static readonly object lockHelper = new object();
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockHelper)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    

    解决了线程并发问题,同时避免在每个 Instance 属性方法的调用中都出现独占锁定。还实现了惰性实例化。

    volatile修饰:编译器在编译代码的时候会对代码的顺序进行微调,用volatile修饰保证了严格意义的顺序。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

     JAVA的双重校验单例模式

    public final class Singleton {
        private volatile static Singleton singleton;
        private Singleton() {
        }
        public static Singleton getSingleton() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }  

    利用类加载器

    没有懒加载,利用类装载时实例化,避开了多线程的问题

    C#

    public sealed class Singleton
    {
        private static Singleton instance = new Singleton();
        static private Singleton() { }
        public static Singleton getInstance()
        {
            return instance;
        }
    }

     java

    public final class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton() {
        }
        public static Singleton getInstance() {
            return instance;
        }
    }
    

    类加载器+内部类/嵌套类

    同样采用类加载器避开多线程同步问题,这里却可以只在内部类/嵌套类被调用时加载。优于上一方法。

    C#的嵌套类 

    public sealed class Singleton
    {
        private Singleton() { }
        public static Singleton getInstance() {
            return Nested.instance;
        }
        private class Nested
        {
            internal static readonly Singleton instance = new Singleton();
        }
    }

    JAVA的静态内部类

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

    java利用枚举

    java的枚举常量本身就是实例,而且枚举不能在运行时实例化。

    public enum Singleton {
        INSTANCE;
        public void whateverMethod() {
        }
        class whateverClass{
        }
    }
    

      

    swift 中单例模式

    swift从1.2开始,类中可以使用static修饰词,自带懒加载特性

    class Singleton{
         static let instance =  Singleton()
    }
    

      

      

      

  • 相关阅读:
    架构师考试回顾
    精通 WPF UI Virtualization
    疑难杂症之Web客户端无法登录
    CDTray, 打开,关闭光驱的系统托盘程序
    原来Queryable是这样实现的..
    jQuery.Excel, 使用Ctrl+方向键/Home/End在input表格中移动
    nGoodPersonCards++
    C#数据库数据导入导出系列之三 数据库导出到Excel下
    调用webservice时提示对操作的回复消息正文进行反序列化时出错&&Web service 超过了最大请求长度
    ASP.NET网络映射驱动器无权限访问的解决方案(转)
  • 原文地址:https://www.cnblogs.com/wj033/p/4485884.html
Copyright © 2011-2022 走看看