2016-04-01 5 views
-1

Um sicherzustellen, dass nur eine Instanz der Klasse in einer Multi-Thread-Umgebung erstellt werden, erstellen wir eine Singleton-Klasse mit der folgenden Struktur.So erhalten Sie die Fahrt von Null Einchecken Singleton Entwurfsmuster in Java für eine bessere Leistung

class Singleton { 

    private volatile static Singleton _instance; 

    private Singleton() { 
     // preventing Singleton object instantiation from outside 
    } 

    public static Singleton getInstanceDC() { 
     if (_instance == null) { 
      synchronized (Singleton.class) { 
       if (_instance == null) { 
        _instance = new Singleton(); 
       } 
      } 
     } 
     return _instance; 
    } 
} 

Aber ist es eine Möglichkeit, die Wertentwicklung der Klasse, indem ich Fahrt der Strafe zu verbessern, dass jeder Thread ein null check tun zu zahlen hat, während bevor das Objekt aus der statischen Funktion bekommen?

+7

Null-Checks sind wirklich billig. Ich würde mich nicht um Optimierung kümmern, auch wenn es möglich wäre, das zu optimieren, was ich bezweifle. Vor allem CPUs sind _groß_ bei der Optimierung, wenn Checks fast immer auf die gleiche Art und Weise laufen. Dies ist im Prinzip kostenlos und Sie sollten _really_ etwas anderes finden, worüber Sie sich Sorgen machen müssen. –

+0

Kann man '_instance' nicht einfach statisch initialisieren, anstatt es beim ersten Zugriff zu erstellen? Auf diese Weise müssen Sie nicht bei jedem Zugriff auf Null prüfen. –

+0

Siehe Effektive Java zweite Ausgabe – AlexWien

Antwort

3

Dies wird als vorzeitige Optimierung bezeichnet. Sie nicht wirklich wissen, dass der Null-Check ein Problem verursacht (es ist nicht, vertrau mir). Die Kosten einer Nullprüfung liegen in der Größenordnung von Nanosekunden.

Sorgen Sie sich nur dann um die Leistung, wenn Sie feststellen, dass tatsächlich ein echtes Problem vorliegt. Machen Sie dann ein Profiling, um die Codeabschnitte zu identifizieren, die das Problem verursachen. Optimieren Sie keine Dinge, die "aussehen", als wären sie ein Problem ohne Leistungsstatistiken, um diese Wahrnehmung zu unterstützen.

+0

Vielen Dank @Jim sogar ich weiß das gleiche, dass es nicht die Leistung trifft. aber das war eine Frage, die von einem sehr erfahrenen Entwickler in einem Interview gestellt wurde, was ich nicht beantworten konnte. – Arpan

2

Nach Josh Bloch. Effektive Java Second Edition seit Java 1.5 Dies ist der beste Ansatz

Es ist sicher auch gegen anspruchsvolle Serialisierung oder Reflexion Angriffe.

Denken Sie jedoch immer daran, dass Singletons die Testbarkeit verteidigen. Während der Singleton in Ihrer Frage zu Testzwecken mit Reflektion zurückgesetzt werden kann, kann der in meiner Antwort wahrscheinlich nicht.

Also ich empfehle zweimal zu überlegen, ob ein Singleton benötigt wird, ich vermeide sie immer.

0

Der beste Ansatz für ein Singleton ist die frühe Instanziierung, es sei denn, es gibt Gründe für Ressourcenbeschränkungen.

public class Singleton 
{ 
    //guaranteed thread safe 
    private static final Singleton _instance = new Singleton(); 

    public static Singlegon getInstance() 
    { 
     return _instance; 
    } 
} 
Verwandte Themen