Wie man ein Singleton-Pattern threadsicher initialisiert

Beim Initialisieren eines Singleton-Patterns in Multi-Threading-Umgebungen gilt es, undefiniertes Programmverhalten zu vermeiden und Performanz zu erhalten.

Artikel verschenken
In Pocket speichern vorlesen Druckansicht 20 Kommentare lesen
Wie man ein Singleton-Pattern threadsicher initialisiert
Lesezeit: 14 Min.
Von
  • Rainer Grimm
Inhaltsverzeichnis

Ein Entwurfsmuster oder Pattern beschreibt eine generische Lösung für ein in einem bestimmten Kontext wiederkehrendes Entwurfsproblem. Das Gegenstück dazu heißt Antipattern und zeigt ein Negativbeispiel einer Vorgehensweise, um daraus Lehren zu ziehen.

Das Singleton-Pattern ist ein klassischer Anwendungsfall für eine Variable, die sich nur einmal initialisieren und dann nur noch lesend verwenden lässt. Als eines der klassischen Patterns aus dem Buch "Design Patterns: Elements of Reusable Object-Oriented Software" der Gang of Four zählt es zu den sogenannten Creational Patterns (Erzeugungsmuster) und genießt einen ambivalenten Ruf. Für die eine Hälfte der Softwareentwickler ist es ein Pattern, für die andere ein Antipattern. Ein Singleton-Pattern ist eine verkappte globale Variable, was mit den folgenden Konsequenzen einhergeht:

  • Das Singleton-Pattern untergräbt die Testbarkeit der Software, da seine Verwendung typischerweise nicht im Interface einer Funktion dokumentiert ist. Damit besitzt die Funktion eine implizite Abhängigkeit.
  • Nach seinem Erzeugen lebt es in der klassischen Form bis zum Ende des Prozesses.
  • Bei in verschiedenen Quelldateien erzeugten und voneinander abhängigen Singletons ist die Reihenfolge ihrer Erzeugung nicht wohldefiniert. Dieses Phänomen ist unter dem Namen "Static Initialization Order Fiasco" bekannt.
  • Die threadsichere Initialisierung eines Singletons besitzt eigene Herausforderungen.

Das Singleton-Pattern stellt sicher, dass es nur eine Instanz einer Klasse gibt. Die Geschichte der threadsicheren Initialisierung eines Singleton-Patterns zeigt aber auch, dass falsche Optimierung sich nicht auszahlt und zu undefiniertem Verhalten führen kann.