【问题标题】:Singleton for two running instances of the same class同一类的两个正在运行的实例的单例
【发布时间】:2015-03-30 01:14:00
【问题描述】:

我正在用 Java 对聊天客户端-服务器进行套接字编程。 我需要在客户之间共享变量。我尝试使用单例设计模式,但每次运行客户端类的新实例时都会得到一个不同的单例类实例。

这是我的代码。我需要在客户端之间共享clients,以便每个人都知道所有其他人。

private LinkedHashMap<String, String> clients = new LinkedHashMap<String, String>();

private static ClientListModel instance = null;

private ClientListModel() {
    System.out.println("NEW INSTANCE!");
}

public static ClientListModel getInstance() {
    if (instance == null)
        instance = new ClientListModel();

    return instance;
}

“新实例!”每次运行客户端代码时都会打印出来,实际上我得到一个空的clients LinkedHashMap。

在同一类的两个或多个运行实例之间共享数据的正确方法是什么?

谢谢!

【问题讨论】:

  • 您的 getInstance() 方法是如何被调用的?它是从服务器调用的吗?有多少个服务器实例正在运行?您能否提供有关如何调用 getInstance() 的代码?此外,您可以参考this answer 获取 java 单例
  • getInstance() 正在从客户端调用。只有一个服务器实例正在运行。
  • 如果您在 Web 服务器中运行它,它可能会为每个会话加载此类。这意味着每个用户都有自己的此类和这些字段的副本。
  • 单例模式仅在单个 VM 实例中有效——即使在那时也有办法打破它。如果您希望客户端和服务器在不同的虚拟机甚至不同的机器上运行但共享一个对象,那么您正在寻找RMI

标签: java singleton


【解决方案1】:

在我看来,你应该确保线程的同步。所以你可以像这样更改代码。

public synchronized static  ClientListModel getInstance() {
    if (instance == null)
        instance = new ClientListModel();

    return instance;
}

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2014-10-04
    • 2021-01-20
    相关资源
    最近更新 更多