zoukankan      html  css  js  c++  java
  • 单例模式

    模式:懒汉模式、饿汉模式

    经常用的单例模式写法:双重校验-基于懒汉模式

    还有登记方式和枚举不讲

    懒汉模式:我很懒,你什么时候用到我,我就初始化一个唯一的实例给你用,如果你不用到我,我就步实例化一个唯一实例给你了,你用我就做,你不用,我就不做,就是这么懒(你拿鞭子抽我啊!)。

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

      懒汉模式(上面代码):线程不安全,线程A判断singleton==null后还没有创建对象,线程B判断singleton==null,这时线程A没有创建对象,所以线程B会再次执行new操作,就会出现2个对象,不符合单例的唯一。

      这时候可以通过synchronization装饰getInstance(),可以解决线程不安全问题,但会影响性能。

    饿汉模式(静态初始化):我真的很饿,管你用不用,我先实例化出来,先看到我才放心(哪怕画饼充饥也好)。

    public class hungrySingleton {
        private static hungrySingleton singleton = new hungrySingleton();
        private hungrySingleton(){};
        public static hungrySingleton getInstance(){
            return singleton;
        }
    }
    

      饿汉模式(上面代码):线程安全,但是因为是static的所以编译时,就已经在内存中占用空间。

    双重校验-基于懒汉模式:针对上面线程不安全的问题,给出的解决方法。

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

      以上单例都重写了默认构造函数,修饰符为private,防止通过new来创建单例对象。

  • 相关阅读:
    简单获取input file 选中的图片,并在一个div的img里面赋值src实现预览图片
    MVC4方法行为过滤器例子(用户登录)
    MVC4过滤器
    MVC4 @RenderBody、@RenderSection、@RenderPage、Html.RenderPartial、Html.RenderAction的作用和区别
    FPGA之外,了解一下中断
    滤波器中的窗口
    关于有限脉冲响应滤波器
    分布式算法原理
    学习FPGA过程中的理论知识
    关于硬件实现FFT逆运算
  • 原文地址:https://www.cnblogs.com/y-z-x/p/9059061.html
Copyright © 2011-2022 走看看