2016-04-18 4 views
3

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 
+1

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. –

Antwort

3

den Verweis aus dem statischen Feld verhindert, daß das von Singleton Garbagekollektor zu werden. Das Singleton-Objekt wird von einem statischen Feld in der MySingleton-Klasse referenziert. Die Klasse wird vom Klassenlader referenziert. Sobald eine Klasse geladen ist, wird sie nicht GC-ed, bis ihr Classloader verschwindet.

Das Ausblenden der Variablen, die den vom Aufruf von getInstance zurückgegebenen Verweis enthält, hat keine Auswirkungen auf den Verweis im statischen Feld instance.

Ein Teil des Problems bei der Verwendung von statischen Feldern ist das Potenzial für Speicherlecks, dass Sachen, die von ihnen referenziert werden, herumhängen und auf unbestimmte Zeit Speicher belegen können.

Verwandte Themen