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

    单例模式使用非常的广泛,那么你会使用哪几种方式去实现呢?

    双重锁检查

    /**
     * 懒汉式-双重检查
     */
    public class SingleDcl {
        //一定要使用volatile关键字。
        private volatile static SingleDcl singleDcl;
        private SingleDcl(){
        }
    
        public static SingleDcl getInstance(){
            if(singleDcl==null) {
                synchronized (SingleDcl.class) {//类锁
                    if(singleDcl==null) {
                        /**如果不使用volatile关键字,这时候判断singleDcl不为null,但是new SingleDcl()不是原子的
                        *可能先将内存中的某块空间分给这个对象,并给与一个地址,但是此时对象并没有完全初始化好
                        *比如构造器中的初始化内容较多等等,当然还涉及到指令重排序等等原因。导致报空指针 
                        */
                        singleDcl = new SingleDcl();
                    }
                }
            }
            return singleDcl;
        }
    }

    饿汉式

    package com.xiangxue.ch7.dcl;
    
    /**
     * @author Mark老师   享学课堂 https://enjoy.ke.qq.com 
     * 饿汉式
     */
    public class SingleEHan {
        public static SingleEHan singleEHan = new SingleEHan();
        private SingleEHan(){}
    
    }

    懒汉式-----静态内部类

    package com.xiangxue.ch7.dcl;
    
    /**
     * 懒汉式-类初始化模式
     */
    public class SingleInit {
        private SingleInit(){}
    
        //定义一个私有类,来持有当前类的实例
        private static class InstanceHolder{
            public static SingleInit instance = new SingleInit();
        }
    
        public static SingleInit getInstance(){
            //当调用此方法时,InstanceHolder类才开始初始化,因为使用了其static变量,此时才会实例化SingleInit对象
            return InstanceHolder.instance;
        }
    
    }
  • 相关阅读:
    构建之法 阅读笔记04
    团队项目-个人博客6.6
    个人总结
    第十六周学习进度条
    第十五周学习进度条
    构建之法阅读笔记07
    大道至简阅读笔记03
    大道至简阅读笔记02
    大道至简阅读笔记01
    第十四周学习进度条
  • 原文地址:https://www.cnblogs.com/alimayun/p/12174092.html
Copyright © 2011-2022 走看看