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

    简单,又不简单,看看便知道。建议采用demo-4。

    demo-1 懒汉式(synchronized)

    /**
    
    
    
    
    
    
    
    
    
     
    public class Singleton {
     
    /**
    
    
    
    * 定义一个变量来存储创建好的类实例
    
    
    
    */
     
    private static Singleton uniqueInstance = null;
     
    /**
    
    
    
    * 私有化构造方法,好在内部控制创建实例的数目
    
    
    
    */
     
    private Singleton(){
     
    //
     
    }
     
    /**
    
    
    
    * 定义一个方法来为客户端提供类实例
    
    
    
    * @return 一个Singleton的实例
    
    
    
    */
     
    public static synchronized Singleton getInstance(){
     
    //判断存储实例的变量是否有值
     
    if(uniqueInstance == null){
     
    //如果没有,就创建一个类实例,并把值赋值给存储类实例的变量
     
    uniqueInstance = new Singleton();
     
    }
     
    //如果有值,那就直接使用
     
    return uniqueInstance;
     
    }
     
    /**
    
    
    
    * 示意方法,单例可以有自己的操作
    
    
    
    */
     
    public void singletonOperation(){
     
    //功能处理
     
    }
     
    /**
    
    
    
    * 示意属性,单例可以有自己的属性
    
    
    
    */
     
    private String singletonData;
     
    /**
    
    
    
    * 示意方法,让外部通过这些方法来访问属性的值
    
    
    
    * @return 属性的值
    
    
    
    */
     
    public String getSingletonData(){
     
    return singletonData;
     
    }
     
    }
     

    demo-2 懒汉式 (双重检查加锁)

    public class Singleton {
     
    /**
    
    
    
    * 对保存实例的变量添加volatile的修饰
    
    
    
    */
     
    private volatile static Singleton instance = null;
     
    private Singleton(){    
     
    }
     
    public static Singleton getInstance(){
     
    //先检查实例是否存在,如果不存在才进入下面的同步块
     
    if(instance == null){
     
    //同步块,线程安全的创建实例
     
    synchronized(Singleton.class){
     
    //再次检查实例是否存在,如果不存在才真的创建实例
     
    if(instance == null){
     
    instance = new Singleton();
     
    }
     
    }
     
    }
     
    return instance;
     
    }
     
    }

    demo-3 饿流式

    public class Singleton {
     
    //4:定义一个静态变量来存储创建好的类实例
     
    //直接在这里创建类实例,只会创建一次
     
    private static Singleton instance = new Singleton();
     
    //1:私有化构造方法,好在内部控制创建实例的数目
     
    private Singleton(){        
     
    }
     
    //2:定义一个方法来为客户端提供类实例
     
    //3:这个方法需要定义成类方法,也就是要加static
     
    //这个方法里面就不需要控制代码了
     
    public static Singleton getInstance(){
     
    //5:直接使用已经创建好的实例
     
    return instance;
     
    }
     
    }

    demo-4 内部类

    public class Singleton {
        /**
         * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
         * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
         */
        private static class SingletonHolder{
            /**
             * 静态初始化器,由JVM来保证线程安全
             */
            private static Singleton instance = new Singleton();
        }
        /**
         * 私有化构造方法
         */
        private Singleton(){
        }
        public static  Singleton getInstance(){
            return SingletonHolder.instance;
        }
    }

    备注:

    1. 全局共享,独一份;

    2. 构造函数不暴露(如果暴露便不能保证一份),自己负责自己的构造;

    3. 懒汉式:Lazy load,用到才加载,非线程安全。如何保证线程安全呢:

    (1) synchronized getInstance()。见demo-1

    (2)双重检查加锁。见demo-2。

    4. 饿汉式:一开始就申请好,浪费了点资源,但其线程安全。 见demo-3。

    5. 内部类:

    (1)改成内部类,由JVM保证线程安全性。见demo-4。

    参考:

    http://www.cnblogs.com/sjms/archive/2010/08/27/1809759.html

  • 相关阅读:
    上传相同文件名的时候不能触发change事件的解决方案
    react自定义组件属性类型检测
    在react项目当中使用redux
    redux使用需要注意的地方
    关于在redux当中 reducer是如何知道传入的state是初始化state下面的哪一条数据
    react当中子组件改变父组件的状态
    vscode编辑器开发react时,设置使emmet支持自定义组件
    Sass之二(进阶篇)
    Sass之一(基础篇)
    sass ruby环境 安装配置,使用sublime text3 中sass
  • 原文地址:https://www.cnblogs.com/alipayhutu/p/2509646.html
Copyright © 2011-2022 走看看