Sorry, wenn der Titel verwirrend ist, werde ich erklären. Ich habe eine Klasse, die ein Singleton-Muster verwendet, und einen Zeitstempelwert, der bei Instanziierung festgelegt wird. Im folgenden Beispiel instanziiert eine zweite Klasse diesen Singleton (und den Standardwert). Ich habe dann die Referenz dieser zweiten Klasse auf null
gesetzt. Ich erhalte dann das Singleton erneut und es hat immer noch den gleichen Standardwert. Dies ist die wünschenswerte Funktionalität für meine Bedürfnisse, aber ich möchte besser verstehen, warum der Singleton am Leben blieb. Etwas mit der JVM zu tun? Oder gibt es eine Art Garbage-Collection, die die Singleton-Instanz (und ihren ursprünglichen Standardwert) löschen würde?Wenn ein Singleton von keinem anderen Objekt referenziert wird, wie oder warum bleibt es am Leben?
MySingleton.java
import java.sql.Timestamp;
public class MySingleton {
private MySingleton() { }
private static MySingleton instance;
private static String defaultTimeStamp;
public static MySingleton getInstance() {
// Lazy instantation
if (instance == null) {
instance = new MySingleton();
// Assign the default value
java.util.Date date = new java.util.Date();
defaultTimeStamp = (new Timestamp(date.getTime())).toString();
}
System.out.println(defaultTimeStamp);
return instance;
}
}
SingletonTest.java
public class SingletonTest {
public static void main(String args[]) throws InterruptedException {
MySingleton mySingleton1 = MySingleton.getInstance();
mySingleton1 = null;
Thread.sleep(1000);
MySingleton mySingleton2 = MySingleton.getInstance();
}
}
Output
2016-04-18 11:30:47.151
2016-04-18 11:30:47.151
Der ClassLoader verweist auf die Klasse, die auf die statischen Felder verweist. Wenn Sie in einem Klassenlader keinen Bezug mehr auf eine Klasse (oder eine Instanz einer Klasse) haben, kann die gesamte Menge als GED angegeben werden. –