首页 > 代码库 > 使用静态内部类实现单例设计模式

使用静态内部类实现单例设计模式

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

一、代码

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

二、小结

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

使用静态内部类实现单例设计模式