我正在尝试使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 仍在执行。
每当实现单例时,该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 和所有关联类的另一个“副本”。因此,您有两个独立的单例——每个程序一个。两者之间不共享课程。
你提到两个类“都有自己的主”,所以我假设你有两个单独的程序。
长话短说,两个程序之间并没有真正共享数据。单例类将确保您在单个程序中只有该对象的一个实例,但两个程序仍将彼此完全独立并且不能以这种方式共享数据。
即使您只有一个带有“main”的类并且只运行了两次,情况也是如此。
如果你想在这样的程序之间共享数据,你有很多很多选择,但有些是: