zoukankan      html  css  js  c++  java
  • 单例模式(简单使用)

    简介

    单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

    双重检查模式[推荐使用]

      1、线程安全

    public class Singleton {
      //将构造器私有化
      private Singleton() {}
      //初始化静态变量 volatile(共享) 强制 singleton变量 使用的地址都是一样的
      private static volatile Singleton singleton;
      //构造一个静态方法,通过它来初始化或反还对象
       public static Singleton getInstance() {
         //双重检查机制
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }

    饿汉模式(静态常量)[可用]

      1、线程安全

       缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。

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

    还有一种写法(静态代码块)

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

    静态内部类[可用]

      1、线程安全

      2、充分利用了静态内部类的特性,在里面初始化 类 实例

       3、只会被初始化一次

        4、只有当静态内部类内部的属性、方法等被调用的时候,静态内部类才会被加载

    public class Boss {
        // 1. 将构造器私有化
        private Boss() { }
    
        // 2. 充分利用了静态内部类的特性,在里面初始化 Boss 实例
        //    - 只会被初始化一次
        //    - 只有当静态内部类内部的属性、方法等被调用的时候,静态内部类才会被加载
        static class Singleton {
            private final static Boss INSTANCE = new Boss();
        }
    
        // 3. 提供一个公共方法,获取实例化好之后的对象
        public static Boss getInstance() {
            return Singleton.INSTANCE;
        }
    }

    懒汉模式[不可用]

      1、线程不安全

      2、这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式

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

    懒汉模式(线程安全,同步方法)【不推荐使用】

      1、缺点:效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低要改进。

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

     。

  • 相关阅读:
    Dynamics AX 2012 R2 在增强入站端口中找不到自定义服务操作
    Dynamics AX 2012 R2 切换环境后项目导入报错
    win8以上版本离线安装.NET
    Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具
    Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具
    vs2010 仿XCode风格的头注释宏
    [转]微软SerialPort秘籍[SerialPort为什么死锁程序的分析]
    jqGrid中选择的行的数据[转]
    【JQGRID DOCUMENTATION】.学习笔记.6.Editing:Common Rules
    【JQGRID DOCUMENTATION】.学习笔记.5.Form Editing
  • 原文地址:https://www.cnblogs.com/oukele/p/9473136.html
Copyright © 2011-2022 走看看