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来创建单例对象。

  • 相关阅读:
    与大神聊天1h
    《海上钢琴师》观后感
    《小王子》读书笔记
    Joining Data with dplyr in R
    SQL学习笔记1
    电影《受益人》观后感
    markdown文本编辑学习笔记2
    importing-cleaning-data-in-r-case-studies
    一个测试人员的工作该怎么开展
    测试总结报告
  • 原文地址:https://www.cnblogs.com/y-z-x/p/9059061.html
Copyright © 2011-2022 走看看