zoukankan      html  css  js  c++  java
  • 设计模式之单例模式(Java实现)

    单例模式分为饿汉式和懒汉式,单例类的特点是:确保一个类只能实现一个实例,自行实例化并向整个系统提供这一实例。

    饿汉式就是当类加载的时候,已经自行实例化了,线程安全;

    饿汉式的代码如下:

    public class EHanSignle {
        //私有静态类变量
        private static final EHanSignle eHanSignle = new EHanSignle();
        
        //私有构造方法,只能在类的内部实例化
        private EHanSignle() {}
        
        //公有静态方法。供类调用
        public static EHanSignle getInstance() {
            return eHanSignle;
        }
    }

    懒汉式就是第一次实例化的时候,才调用方法实例化自己

    懒汉式代码(线程不安全)如下所示

    public class LHanSignle {
        private static LHanSignle lHanSignle = null;
        private LHanSignle() {}
        
        public static LHanSignle getInstance() {
            if(lHanSignle == null) {
                lHanSignle = new LHanSignle(); 
            }
            return lHanSignle;
        }
    }

    为了实现线程安全有三种方法:

    第一种就是在getInstance的方法上加同步;

    public class LHanSignle {
        private static LHanSignle lHanSignle = null;
        private LHanSignle() {}
        
        public static synchronized LHanSignle getInstance() {
            if(lHanSignle == null) {
                lHanSignle = new LHanSignle(); 
            }
            return lHanSignle;
        }
    }

    第二种就是双重检查锁定

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

    第三种方法就是静态内部类(推荐):

    public class LHanSignle {
        private static class loadClass{
            private static final LHanSignle lHanSignal = new LHanSignle();
        }
        private LHanSignle() {}
        
        public static LHanSignle getInstance() {  
            return loadClass.lHanSignal; 
        }  
    }
  • 相关阅读:
    hdu5628 Clarke and math
    LOJ#2452. 「POI2010」反对称 Antisymmetry
    LOJ#2444. 「NOI2011」阿狸的打字机
    BZOJ2795: [Poi2012]A Horrible Poem
    LOJ#2427. 「POI2010」珍珠项链 Beads
    云主机文件系统readonly处理案例
    兼容性测试中如何切换和管理多个JDK版本
    Promise之你看得懂的Promise
    一次MySQL线上慢查询分析及索引使用
    考拉消息中心消息盒子处理重构(策略模式)
  • 原文地址:https://www.cnblogs.com/meteorst/p/9219092.html
Copyright © 2011-2022 走看看