zoukankan      html  css  js  c++  java
  • 使用静态内部类实现单例设计模式

                前几天看了下公司代码中的一个单例类,发现居然是用静态内部类实现的。后面在网上找了下资料,发现使用静态内部实现的单例是懒加载的且线程安全。
                从网上资料得出如下结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。

    一、代码

    package com.zxy.test;
    /**      
     * 使用静态内部类实现的单例类
     * @author  ZENG.XIAO.YAN    
     * @date    2017-08-08 10:29:20
     * @version  V1.0    
     */
    
    public class UserSingleton {
        
        /** 私有化构造器 */
        private UserSingleton() {
        }
    
        /** 对外提供公共的访问方法 */
        public static UserSingleton getInstance() {
            return UserSingletonHolder.INSTANCE;
        }
    
        
        /** 写一个静态内部类,里面实例化外部类 */
        private static class UserSingletonHolder {
            private static final UserSingleton INSTANCE = new UserSingleton();
        }
    
    }
    package com.zxy.test;
    /**     
     * 使用静态内部类实现的单例类
     * @author  ZENG.XIAO.YAN    
     * @date    2017-08-08 10:29:20
     * @version  V1.0    
     */
    public class UserSingleton {
    	
    	/** 私有化构造器 */
        private UserSingleton() {
        }
    
        /** 对外提供公共的访问方法 */
        public static UserSingleton getInstance() {
            return UserSingletonHolder.INSTANCE;
        }
        
        /** 写一个静态内部类,里面实例化外部类 */
        private static class UserSingletonHolder {
            private static final UserSingleton INSTANCE = new UserSingleton();
        }
    
    }

    二、小结

            (1)为什么这样实现就是单例的?
                     因为这个类的实例化是靠静态内部类的静态常量实例化的。
                     INSTANCE 是常量,因此只能赋值一次;它还是静态的,因此随着内部类一起加载。
            (2)这样实现有什么好处?
                      我记得以前接触的懒汉式的代码好像有线程安全问题,需要加同步锁才能解决。
                      采用静态内部类实现的代码也是懒加载的,只有第一次使用这个单例的实例的时候才加载;
                       同时不会有线程安全问题
            (3)参考文档
                        http://yongliang567.iteye.com/blog/904467

  • 相关阅读:
    python求余、除法运算、向下圆整、round圆整
    【转】从入门到实践 json练习详解~~和ython : groupby 结果浅解,&之后的 y_list=[v for _,v in y]
    ### 模块“*.dll”已加载,但对DllRegisterServer的调用失败,错误代码为0x80070005
    python从excel里读取数据
    文本文件和二进制文件的区别
    析构函数 声明为protected
    c语言中ln,lg,log的表示。c语言中ln,lg,log的表示。
    js设计模式--创建型--单例模式
    js设计模式--创建型--工厂模式
    解决ElementUI的table组件在flex布局下宽度不能自适应的问题
  • 原文地址:https://www.cnblogs.com/zeng1994/p/7397637.html
Copyright © 2011-2022 走看看