java - 具有多个实例的单例?

标签 java multithreading static singleton

背景

我有这样一种情况,我正在开发一个像线程一样运行的程序。基本上,有一个同时运行子程序实例的“主”程序。

由于这个系统的性质,“子程序”都在一个 Java Virtual Machine 下运行。 .这里最严重的暗示是它们共享内存空间。

在我的子程序中,我想创建一个 Logger 类,以便我的子程序中的所有类都可以记录到一个位置。由于这个项目可以包含很多类,我想避免依赖注入(inject)并使用单例。

但是如果我使用单例,实例将被静态存储。因此,如果 JVM 有 2 个我的程序实例在运行,Logger 类将为它们提供相同的实例(因为它们共享该内存)。

我希望每个子程序都有自己的记录器,无需依赖注入(inject)。

存在一个唯一的标识符,我可以为每个程序调用以区分它们。


我目前的解决方案

假设“uniqueID”是主程序接收的 API 调用,然后返回调用它的子程序。假设此调用产生极少的计算开销。

public class Logger {
    private static HashMap<string,Logger> instances = new Hashmap<>();

    public static Logger instance() {
        if(instances.containsKey(uniqueId)) {
            return instances.get(uniqueId);
        } else {
            Logger newLogger = new Logger();
            instances.put(uniqueId, newLogger);
            return newLogger;
        }
    }

    private Logger(){}
}

该解决方案允许每个子程序将 Logger 类视为 Singleton,但又不完全是 Singleton。它充当实例管理器,根据与方法交互的子程序创建和返回实例。


我的问题

此解决方案在技术上不是单例,但使用它的每个项目都将其视为单例。 是什么设计模式?

此外,这是解决我的问题的正确方法吗?我该如何改进它?

最佳答案

如果我没看错,你需要一个基于线程的 multiton . Java 提供了 ThreadLocal 类来支持该模式。稍微考虑一下,您可以实现一个静态 logMessage() 方法,该方法在幕后使用 ThreadLocal 来检索正确的记录器实例。

在 JEE 应用程序服务器环境中应注意避免在应用程序上下文重新启动时发生内存泄漏,但我认为这不适用于您的情况。

关于java - 具有多个实例的单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642129/

相关文章:

Java - 调用异常

java - Spring 如何构造传递给 Controller ​​方法的对象?

c++ - MFC 线程 UI 中的帮助

java - 如何从 Thread 对象重新绘制 jTree?

c++ - 计算使用共享库的程序数

c++ - 在编译时设置静态常量值(不是通过预处理器)

javascript - 通过解析云码功能下载图片

java - 我正在尝试使用 TestNG 在 selenium 3.0.1 中启动 Firefox,但我无法做到这一点。我也使用过 setProperty

C++ 从异步线程更新 Windows 窗口

c# - Asp.Net 刷新页面的静态方法