美文网首页
继续从zuul里看一个类,懒汉式单例的实现

继续从zuul里看一个类,懒汉式单例的实现

作者: 天草二十六_简村人 | 来源:发表于2022-05-19 10:08 被阅读0次

本文我们将分析懒汉式单例模式的写法

  • 定义一个实例变量
static FilterFileManager INSTANCE;
  • 私有的无参构造函数
    private FilterFileManager() {
        this.bRunning = true;
    }
  • 提供一个公共方法,让外部类可以获取实例
    public static FilterFileManager getInstance() {
        return INSTANCE;
    }

与饿汉式的区别是,懒汉式对实例的初始化,是在init()公共方法调用的时候,如果实例不为null, 才进行初始化实例。

       if (INSTANCE == null) {
            INSTANCE = new FilterFileManager();
        }
  • init()方法的入参directories,使用了可变长度参数,写法比较优雅,可以直接赋值给String数组(String[] aDirectories)
  • shutdown() 方法是把线程工作的标识设置为false,让线程停止工作。

该类的核心实现是创建一个线程(Thread poller),每个固定时间进行某个动作(manageFiles()),直至bRunning标识为false。而它在实例初始化的时候便已被赋值为true了,也就是说,那时候就可以工作了。

线程在启动的时候,一般会设置为this.poller.setDaemon(true);然后是this.poller.start();这已经是手动创建线程的标准模式了。


package com.netflix.zuul;

public class FilterFileManager {
    private static final Logger LOG = LoggerFactory.getLogger(FilterFileManager.class);
    String[] aDirectories;
    int pollingIntervalSeconds;
    Thread poller;
    boolean bRunning;
    static FilenameFilter FILENAME_FILTER;
    static FilterFileManager INSTANCE;

    private FilterFileManager() {
        this.bRunning = true;
    }

    public static void setFilenameFilter(FilenameFilter filter) {
        FILENAME_FILTER = filter;
    }

    public static void init(int pollingIntervalSeconds, String... directories) throws Exception, IllegalAccessException, InstantiationException {
        if (INSTANCE == null) {
            INSTANCE = new FilterFileManager();
        }

        INSTANCE.aDirectories = directories;
        INSTANCE.pollingIntervalSeconds = pollingIntervalSeconds;
        INSTANCE.manageFiles();
        INSTANCE.startPoller();
    }

    public static FilterFileManager getInstance() {
        return INSTANCE;
    }

    public static void shutdown() {
        INSTANCE.stopPoller();
    }

    void stopPoller() {
        this.bRunning = false;
    }

    void startPoller() {
        this.poller = new Thread("GroovyFilterFileManagerPoller") {
            public void run() {
                while(FilterFileManager.this.bRunning) {
                    try {
                        sleep((long)(FilterFileManager.this.pollingIntervalSeconds * 1000));
                        FilterFileManager.this.manageFiles();
                    } catch (Exception var2) {
                        var2.printStackTrace();
                    }
                }

            }
        };
        this.poller.setDaemon(true);
        this.poller.start();
    }

相关文章

  • 继续从zuul里看一个类,懒汉式单例的实现

    本文我们将分析懒汉式单例模式的写法 定义一个实例变量 私有的无参构造函数 提供一个公共方法,让外部类可以获取实例 ...

  • 第3章 创建型模式-单例模式

    ■ 饿汉式单例类 ■ 懒汉式单例类 ■ 单例模式的实例

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

  • 单例

    使用单例设计模式的类只有一个对象实例,基于此核心来编写代码。 懒汉式 饿汉式 内部静态类实现单例 枚举单例 上述单...

  • 单例模式之枚举类enum

    通过枚举实现单例模式 枚举类实现单例模式的优点 对于饿汉式单例模式和懒汉式单例模式了解的同学,使用以上两种单例模式...

  • 单例模式

    单例,全局只有一个实例 单例模式可以分为懒汉式和饿汉式: 懒汉式单例模式:在类加载时不初始化。 饿汉式单例模式:在...

  • 单例模式

    单例模式的实现: 单例设计模式分类两种: -饿汉式:类加载就会导致该单实例对象被创建 -懒汉式:类加载不会导致该单...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • Android单例模式详解

    一.什么是单例 单例对象的类必须保证只有一个实例存在 对单例的实现可以分为两大类——懒汉式和饿汉式,他们的区别在于...

  • Android设计模式(单例模式)

    目录 1.单例模式简介 2.单例模式关键点 3.单例模式UML图 4.单例模式的实现方式饿汉式懒汉式同步锁懒汉式D...

网友评论

      本文标题:继续从zuul里看一个类,懒汉式单例的实现

      本文链接:https://www.haomeiwen.com/subject/nlxtprtx.html