zoukankan      html  css  js  c++  java
  • 23种设计模式——单例模式

    23种设计模式——单例模式

    饿汉式

    先创建对象,要使用的使用直接拿

    package com.mjh.single;
    
    public class Hungry {
        //可能会浪费
        private byte[] da=new byte[1024*1024];
        private byte[] da1=new byte[1024*1024];
        private byte[] da2=new byte[1024*1024];
        private byte[] da3=new byte[1024*1024];
        private Hungry(){}
        private final static Hungry HUNGRY=new Hungry();
        public static Hungry getInstance(){
            return HUNGRY;
        }
    }
    

    懒汉式

    1)简单式(单线程)

    public class LazyMan {
        private LazyMan(){}
        private   static LazyMan lazyMan;
    public static  LazyMan getInstance(){
        if (lazyMan == null) {
                        lazyMan = new LazyMan();
        }
        return lazyMan;
    }
    

    2)在多线程并发下,双重检测

    懒汉模式在多线程并发下有一定的问题,所以我们要加双重检测锁;在这一过程中 lazyMan = new LazyMan();并不是一个原子性,会出现指令重排现象(打乱了存储的顺序),对于这种情况还要加上volatile

    package com.mjh.single;
    
    public class LazyMan {
        private LazyMan(){}
        private  volatile  static LazyMan lazyMan;
    
        //双重检测锁模式的  懒汉式单利  DCL懒汉式
        public static  LazyMan getInstance(){
            if(lazyMan==null){
                synchronized (LazyMan.class) {
                    if (lazyMan == null) {
                        lazyMan = new LazyMan();//不是一个原子性操作
                        /**
                         * 1.分配内存空间
                         * 2.执行构造方法,初始化对象
                         * 3.把这个对象指向这个空间
                         *
                         * 123
                         * 132  A   没有问题
                         * 突然来了   B//此时LazyMan还没有完成构造 就会默认为lazyMan不等于null,直接返回
                         * 为了避免指令重排,必须加上 volatile
                         */
                    }
                }
            }
            return lazyMan;//此时lazyMan还没有完成构造
        }
    }
    

    3)静态内部类的懒汉模式

    package com.mjh.single;
    
    import com.sun.org.apache.bcel.internal.classfile.InnerClass;
    
    public class Holder {
        private Holder(){}
        public static Holder getInstance(){
            return InnerClass.HOLDER;
        }
        public static class InnerClass{
            private static final Holder HOLDER = new Holder();
        }
    }
    
  • 相关阅读:
    [CSP-S模拟测试]:集合合并(记忆化搜索)
    [CSP-S模拟测试]:小L的数(数位DP+模拟)
    [CSP-S模拟测试]:小Y的图(最小生成树+LCA)
    [CSP-S模拟测试]:小W的魔术(数学 or 找规律)
    [CSP-S模拟测试]:最大值(数学+线段树)
    [CSP-S模拟测试]:最小值(DP+乱搞)
    [CSP-S模拟测试]:中间值(二分)
    [CSP-S模拟测试]:Cover(单调栈++单调队列+DP)
    [JZO6401]:Time(贪心+树状数组)
    BZOJ3193 [JLOI2013]地形生成 【dp】
  • 原文地址:https://www.cnblogs.com/mjjh/p/13296035.html
Copyright © 2011-2022 走看看