单例类不起作用

Ume*_*yan 3 java singleton

我正在尝试使Clients类成为单例,但它不起作用。这是我的课:

public class Clients {
    private static Clients instance = null;
    private ArrayList<Client> cList;

    private Clients() {
        cList = new ArrayList<Client>();
    }

    public static Clients getInstance() {
        if (instance == null) {
            System .out.println("created");
            instance = new Clients();
        }

        return instance;
    }

    public static ArrayList<Client> getcList() {
        return getInstance().cList;
    }

    public static void setcList(ArrayList<Client> cList) {
        getInstance().cList = cList;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在两个不同的类中得到这个实例(都有自己的主要功能)。在一个类中获取它的实例后,我在另一个类中获取它,但两个 tiare 仍在执行。

ast*_*eri 5

每当实现单例时,该getInstance()方法都应该是线程安全的。

例如,

public static synchronized Clients getInstance()
Run Code Online (Sandbox Code Playgroud)

... 或者 ...

private static final Object INSTANCE_LOCK = new Object();

public static Clients getInstance() {
    synchronized(INSTANCE_LOCK) {
        if(instance == null) instance = new Clients();
    }
    return instance;
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您实际上是从两个不同的程序而不是两个不同的线程执行这段代码,那么您将有两个实例。我假设是前者,因为后者让你的问题变得毫无意义。

我想我应该解释一下为什么这是荒谬的。

当您使用方法执行 Java 程序时main(String[] args),所有类都会加载到 JVM 中。如果您随后执行另一个程序,您将获得另一个 JVM 和所有关联类的另一个“副本”。因此,您有两个独立的单例——每个程序一个。两者之间不共享课程。


Jas*_*n C 5

你提到两个类“都有自己的主”,所以我假设你有两个单独的程序。

长话短说,两个程序之间并没有真正共享数据。单例类将确保您在单个程序中只有该对象的一个​​实例,但两个程序仍将彼此完全独立并且不能以这种方式共享数据。

即使您只有一个带有“main”的类并且只运行了两次,情况也是如此。

如果你想在这样的程序之间共享数据,你有很多很多选择,但有些是:

  • 看看您是否真的可以将两个独立的程序合二为一。你真的需要两个程序吗?
  • 使用数据库来存储您的数据,MySQL 和 SQLite 是其中的两个简单选项。
  • 一个程序可以将数据写入文件,而另一个程序可以读取它。
  • 还有许多其他选项可以将数据从一个程序发送到另一个程序,例如套接字(已经存在无数网络协议,而且您可以自己开发)、特定于平台的东西,例如 Windows 上的命名管道、共享内存等. 查看谷歌搜索“java ipc”(进程间通信——这些是允许两个程序相互通信的通用技术)的结果。