Sinn eines Singleton ?

Werniman

Mitglied
Hallo,
ich bin gerade wieder dabei, ein paar Sachen aus Büchern nachzubauen, um meine Kenntnisse zu erweitern. Dabei bin ich in einem Listing auf die Zeile
Calendar cal1 = Calendar.getInstance(); gestoßen, wobei ich mit dem getInstance nichts anfangen konnte. Beim Suchen im Netz habe ich rausgefunden,dass das ein sogenanntes Singleton ist,was immer dann genutzt werden soll,wenn es nur eine einzige Instanz einer Klasse geben soll und es Fehler gibt,wenn man weitere anlegt. Klingt erstmal logisch.

Testweise hab ich dann mal eine weitere Zeile eingefügt, wo sich nur der Name unterscheidet:
Calendar cal2 = Calendar.getInstance();

Nur...da ist kein Fehler. Hab ich da irgendwas falsch verstanden ?
 

mihe7

Top Contributor
Naja, getInstance liefert ja nur eine Referenz und die referenziert nur ein einziges Objekt.

Das Singleton-Pattern wird etwa so umgesetzt

Java:
class A {
    private static A instanz = new A();

    private A() {}
    public static A getInstance() { return instanz; }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Hat schlicht den Vorteil, dass du keine Instanz von A in der Laufzeit hast bevor sie benötigt wird
Hat den Nachteil, nicht Threadsafe zu sein :p


Java:
public class A  {   
    private static class Holder {   
        public static final A instance = new A();
    }   

    private A() {}

    public static A getInstance() {   
        return Holder.instance;   
    }   
}
 
K

kneitzel

Gast
Ja, um den ständigen synchronized check zu vermeiden halt eine doppelte Prüfung. Dann hat man so etwas:
Java:
public class A  { 
    private static Object lock = new Object();
    private static volatile A instance = null;

    private A() {}

    public static A getInstance() {
        if (instance == null) {
          synchronized(lock) {
              if(instance == null) instance = new A();
          }
        }
        return instance; 
    } 
}

Dann hat man halt das gewünschte lazy loading und keine ständigen Performance kostende synchronized checks.
 
Zuletzt bearbeitet von einem Moderator:

httpdigest

Top Contributor
Das Initialization-on-demand holder Pattern, das @mrBrown gezeigt hat, ist das performanteste von allen, da die Synchronisierung beim ersten (und nur beim ersten) Zugriff durch die JVM selbst bei der Klasseninitialisierung des Holders (durch den Zugriff auf das Holder.instance Feld) geschieht und dann nie wieder.
Tatsächlich erlaubt das `static final` noch viel weitreichendere Optimierungen durch den JIT. Z.B. werden dadurch alle Instanzen des Singletons an den Aufruferstellen ge-inlined.
 
K

kneitzel

Gast
Das Initialization-on-demand holder Pattern, das @mrBrown gezeigt hat, ist das performanteste von allen, da die Synchronisierung beim ersten (und nur beim ersten) Zugriff durch die JVM selbst bei der Klasseninitialisierung des Holders (durch den Zugriff auf das Holder.instance Feld) geschieht und dann nie wieder.
Tatsächlich erlaubt das `static final` noch viel weitreichendere Optimierungen durch den JIT. Z.B. werden dadurch alle Instanzen des Singletons an den Aufruferstellen ge-inlined.
Das ist ganz interessant. Das kannte ich so noch nicht muss ich gestehen. Und ich habe jetzt noch einmal nachgesehen: Auch in Entwurfsmuster von Kopf bis Fuß wird das so nicht erwähnt. Da werden auch nur vorzeitige Initialisierung oder eben der doppelte Check als Lösungen angeboten.
 

LimDul

Top Contributor
Das stimmt, das kannte ich auch nicht. Wobei ich persönliche auf die Vorzeitige Initialisierung nicht schlimm finde (sofern das Singleton höchstwahrscheinlich eh braucht)

Die synchronized Varianten mag ich auch nicht. Wer nicht weiß was er tut, baut schnell Code, der auf den ersten Blick Thread Safe aussieht aber auf den zweiten Blick entweder inperformant ist oder eben doch nicht thread safe. Und solche Fallstricke finde ich immer unschön.
 

httpdigest

Top Contributor
Vorzeitige Initialisierung
Das witzige dabei ist ja, dass hier gerade eben nichts vorzeitig vorinitialisiert wird. Die meisten JVMs (zumindest HotSpot, J9) laden Klassen sowieso lazy, wenn sie das erste Mal gebraucht werden; also wenn Code durchlaufen wird, der entweder die Klasse instanziiert oder eine statische Methode aufruft oder ein statisches Feld (das nicht mit einer Compile-time Konstanten initialisiert ist) anfässt. Hier ist letzteres der Fall. Der Singleton wird erst erzeugt, wenn auf das Feld tatsächlich zugegriffen wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Sinn eines Interfaces? Java Basics - Anfänger-Themen 4
M Variable überwachen und Sinn eines Threads Java Basics - Anfänger-Themen 7
D Interfaces von Interfaces macht das noch Sinn? Java Basics - Anfänger-Themen 21
F Hat es noch einen Sinn, alte Versionen zu lernen Java Basics - Anfänger-Themen 45
berserkerdq2 Wo ist der SInn, dass man den Stream, den ich zum Schreiben nutze, outputstream nenne? Java Basics - Anfänger-Themen 5
H Sinn von Interfaces Java Basics - Anfänger-Themen 21
R getUserProperties() macht für mich keinen Sinn Java Basics - Anfänger-Themen 8
E Sinn: final in Parameterliste verwenden Java Basics - Anfänger-Themen 2
B Sinn von Lambdas? Java Basics - Anfänger-Themen 16
5 Welchen Sinn hat ein Runnable Java Basics - Anfänger-Themen 6
P OOP Sinn von abstrakten Klassen Java Basics - Anfänger-Themen 2
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
B Der Sinn von Arrays Java Basics - Anfänger-Themen 2
Q Container sinn? Java Basics - Anfänger-Themen 3
S string index out of range - es ergibt keinen Sinn Java Basics - Anfänger-Themen 6
J Sinn/Nutzen von Scanner Java Basics - Anfänger-Themen 23
B Sinn von Reflections Java Basics - Anfänger-Themen 10
H Vererbung Prinzip der Ersetzbarkeit-Sinn? Java Basics - Anfänger-Themen 9
F Sinn der SuppressWarnings("unused")-Annotation Java Basics - Anfänger-Themen 5
R Sinn des programmes Java Basics - Anfänger-Themen 10
W Sinn von Konstruktorsyntax und finalize Java Basics - Anfänger-Themen 14
J Worin besteht der Sinn und Anwendungsbereich von Dreidimensionalen Arrays? Java Basics - Anfänger-Themen 11
J Datentypen Was ist der Sinn vom Datentyp "char" ? Java Basics - Anfänger-Themen 11
T Sinn von finally? Java Basics - Anfänger-Themen 3
M Variablen Zinseszinsberechnung - Variable ergibt keinen Sinn Java Basics - Anfänger-Themen 15
A Klassen Sinn des Konstruktors Java Basics - Anfänger-Themen 12
P Sinn des Security Managers Java Basics - Anfänger-Themen 2
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
D Sinn von Jar Dateien Java Basics - Anfänger-Themen 5
D Sinn von Interfaces - Wozu? Java Basics - Anfänger-Themen 9
K Sinn eigener Exceptions Java Basics - Anfänger-Themen 11
Luk10 Sinn von Instanzierung ohne Referenz Java Basics - Anfänger-Themen 7
hdi Sinn von RuntimeExceptions? Java Basics - Anfänger-Themen 90
Developer_X NullPointer Exception ohne Sinn Java Basics - Anfänger-Themen 19
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
M Der Java Schlüsselwort null; ?Welche Anweisung und Sinn? Java Basics - Anfänger-Themen 12
A Macht es Sinn Arraylisten mit Gettern zu übergeben? Java Basics - Anfänger-Themen 19
G Sinn vo OOP Java Basics - Anfänger-Themen 5
P Unterschied zwischen Interface und Vererbung und Sinn? Java Basics - Anfänger-Themen 5
G sinn von JList Java Basics - Anfänger-Themen 6
K Sinn von Interfaces Java Basics - Anfänger-Themen 10
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
J Farbe des Striches eines TitledBorders ändern Java Basics - Anfänger-Themen 2
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
walid Öffnungszeiten eines Geschäftes Java Basics - Anfänger-Themen 3
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
krgewb Breite und Höhe eines Bildes in base64 auslesen Java Basics - Anfänger-Themen 3
Sachinbhatt Was ist die Notwendigkeit eines Sammlungsframeworks in Java? Java Basics - Anfänger-Themen 2
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Inhalt eines Arrays ausgeben Java Basics - Anfänger-Themen 7
A Jedes zweite Element eines Arrays entfernen Java Basics - Anfänger-Themen 30
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
M Parse-Tree eines statements darstellen Java Basics - Anfänger-Themen 0
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
J Hinzufügen eines Objektes in ein Objekt-Array Java Basics - Anfänger-Themen 62
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
A Rekursive Implementation eines Codes Java Basics - Anfänger-Themen 4
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
M Wie erreiche ich das Vorwärtsgehen eines Roboters? Java Basics - Anfänger-Themen 2
M Wie erreiche ich es das Vorwärtsgehen eines Roboters? Java Basics - Anfänger-Themen 0
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
A Optimierung eines Programms: Mergen der Dateien Java Basics - Anfänger-Themen 23
melisax Alle Möglichkeiten eines Wortes angeben Java Basics - Anfänger-Themen 3
A Java, verarbeitung eines xml-files Java Basics - Anfänger-Themen 2
C Fehler beim erstellen eines Objektes Java Basics - Anfänger-Themen 3
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1
P Drei Zahlen eines Würfelspiels auswerten Java Basics - Anfänger-Themen 7
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
C initialisieren eines arrays richtiger Größe und mit geeignetem Datentyp Java Basics - Anfänger-Themen 26
C Überprüfen eines Programms auf Syntaxfehler Java Basics - Anfänger-Themen 3
S Wie kann ich den Bereich eines Integers begrenzen? Java Basics - Anfänger-Themen 2
nonickatall Grundsätzliches Verständnisproblem des Aufbaus eines Programms Java Basics - Anfänger-Themen 19
B Downgrade eines bestehenden Projektes Java Basics - Anfänger-Themen 5
amelie123456 Geschwindigkeit der Methode bewegeDich eines Objekts ändern Java Basics - Anfänger-Themen 2
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J maximaler Wert eines Integers Java Basics - Anfänger-Themen 14
TimoN11 IntelliJ , Ausgabe von einem Quellcode in Eingabe eines Quellcodes Java Basics - Anfänger-Themen 1
Z Rückgabe eines Values in umgekehrte richtung Java Basics - Anfänger-Themen 5
L Methode zum invertieren eines Arrays Java Basics - Anfänger-Themen 7
B fragen zu Aufbau eines UML-Klassendiagramm Java Basics - Anfänger-Themen 1
eleonori Durchschnitt aller Werte eines Baums berechnen Java Basics - Anfänger-Themen 5
M Benutzereingabe eines Codes verbessern Java Basics - Anfänger-Themen 3
B Modulo-Operator anhand eines Beispieles erklären Java Basics - Anfänger-Themen 7
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben