【问题标题】:share an instance but create new one for every new process共享一个实例,但为每个新进程创建一个新实例
【发布时间】:2012-02-04 08:41:52
【问题描述】:

这是我的问题--

我有 4 个类 - Starter、Database 和 Scheduler 以及一个 Test 类。

测试类将创建一个新的 Starter 实例(它加载并启动整个过程)。 Starter 初始化 Scheduler 和 Database 类。

Test 类将数据传递给 Starter。 Starter 将其存储在 Database 类中的 HashMap 中。 调度器从 Database 类中读取 same HashMap。

现在,为了确保我的 java 项目中的所有类都可以访问完全相同的 HashMap,我有 2 个选项 - 使 HashMap static 或使 Database 成为 单例类强>。我现在已将 Database 设为一个单例类。

问题——如果测试类这样做

Starter starterInstance1 = new Starter();

Starter starterInstance2 = new Starter();

如何确保 starterInstance1 和 starterInstance2 有自己的 Database 类或 HashMap 实例?

===========

更清楚一点:

类测试{

Starter start1 = new Starter();//创建我的应用程序的 1 个实例

start1.init();//这将初始化Scheduler等并执行“getDatabaseInstance()”

for(int i=0;i

start1.sendData("abc"); //所有这50个请求将b提交到一个线程池,该线程池将发送请求存储在Database类的HashMap中。 HashMap 将由 Scheduler 和其他类同时访问。我已将 Database 类设为单例,以便所有类都可以访问同一个 DB 实例。

}

//类似地创建我的应用程序的另一个实例

Starter start2 = new Starter();

start2.init();//现在如果我执行“getDatabaseInstance()”,我将得到与上面相同的实例。但我想要这个应用程序实例的单独数据库。我如何做到这一点?

for(int i=0;i

start2.sendData("abc");

}

}

【问题讨论】:

  • 如果数据库是单例,我看不出他们怎么会有不同的实例。这就是单例模式的重点。您的问题的一部分说所有类都必须访问相同的确切映射,另一部分说每个启动器实例都应该有自己的实例。你想要什么?
  • 是的,单例意味着只有 1 个实例。但我不想要那个。我的整个应用程序的起点是 Starter 类。每当创建我的应用程序的新实例(即 new Starter())时,我希望它拥有自己的数据库和自己的调度程序,它们将访问同一个数据库。使数据库成为单例类不是这里的解决方案,因为它将意味着每个新的 Starter() 都将使用相同的数据库。我希望每个新的 Starter() 都有自己的数据库

标签: java static singleton instance


【解决方案1】:

对您的问题最一般的回答可能是简单地让Starter 跟踪对其自己的Database 的引用。当然,Scheduler 也必须做同样的事情:

public class Starter {
    Database db;
    Starter(Database db) {
        this.db = db;
    }
}

/* ... */

Database db1 = new Database();
Starter starter1 = new Starter(db1);
Scheduler scheduler1 = new Scheduler(db1);

Database db2 = new Database();
Starter starter2 = new Starter(db2);
Scheduler scheduler2 = new Scheduler(db2);

【讨论】:

  • 是的,这是一种方式。但我的应用程序有点复杂。我正在使用 mina nio 框架通过 TCP 连接传输数据。我将在我的应用程序中需要这个数据库的实例。所以我不能一直把它传给每个班级。此外,我在客户端的 SessionHandler 中使用它。我不能在那里将数据库实例作为构造函数参数传递。顺便说一句,谢谢你的建议!
  • 除非每个 Starter 都有自己的线程(在这种情况下,您可以将数据库存储在 ThreadLocal 中),否则我看不到任何其他方式。如果你有这么多类需要访问数据库实例,你可能有设计问题,并且缺乏封装。
  • 我同意你的看法。我确信这是一个设计问题。但我已经很深了,而且在完成的截止日期!只会通过关于 ThreadLocal 的内容。同时你能为此提出一个设计模式吗?
  • 在这种情况下,你可能想看看我对this question的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多