Singleton: threadveilige implementaties
Bouw een threadveilige Singleton met double-checked locking, een enum of het holder-patroon.
Singleton: threadveilige implementaties is een gratis Java Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Het singletonpatroon
Het singletonpatroon zorgt ervoor dat er binnen de JVM maar één instantie van een klasse bestaat. Veelgebruikte toepassingen zijn configuratiebeheerders, verbindingspools en logregistratieservices.
Naïeve singleton — niet threadveilig
De klassieke luie singleton werkt niet goed bij gelijktijdige toegang: twee threads kunnen de null-controle tegelijk doorlopen en twee instanties maken.
public class Config {
private static Config instance;
private Config() {}
public static Config getInstance() {
if (instance == null) { // race condition!
instance = new Config();
}
return instance;
}
}Gesynchroniseerde methode — eenvoudig maar traag
Door synchronized aan getInstance() toe te voegen, wordt de code threadveilig, maar wordt elke aanroep vergrendeld, ook nadat de instantie al bestaat. Dat veroorzaakt onnodige overhead.
public static synchronized Config getInstance() {
if (instance == null) instance = new Config();
return instance;
}Dubbel gecontroleerde vergrendeling
Controleer eerst zonder vergrendeling en controleer daarna opnieuw binnen een blok met synchronized. Voor het voorkomen van een andere volgorde van instructies is volatile op het veld vereist.
public class Config {
private static volatile Config instance;
private Config() {}
public static Config getInstance() {
if (instance == null) {
synchronized (Config.class) {
if (instance == null) instance = new Config();
}
}
return instance;
}
}Holder voor initialisatie op aanvraag
De veiligste en efficiëntste luie singleton: een private statische geneste klasse bevat de instantie. De JVM laadt die klasse pas wanneer getInstance() voor het eerst wordt aangeroepen; het laden van klassen is van nature threadveilig.
public class Config {
private Config() {}
private static final class Holder {
static final Config INSTANCE = new Config();
}
public static Config getInstance() {
return Holder.INSTANCE;
}
}Enum-singleton
Effective Java raadt een enum met één constante aan. Die aanpak is beknopt, threadveilig, veilig bij serialisatie en immuun voor reflectieaanvallen.
public enum AppConfig {
INSTANCE;
private String apiUrl = "https://api.example.com";
public String getApiUrl() { return apiUrl; }
}
// Usage:
String url = AppConfig.INSTANCE.getApiUrl();Gretige initialisatie
Als de opstartkosten aanvaardbaar zijn, initialiseer je de instantie tijdens het laden van de klasse met een veld van het type static final. Dat is eenvoudig en threadveilig, maar de instantie wordt altijd gemaakt, ook als die nooit wordt gebruikt.
public class Config {
private static final Config INSTANCE = new Config();
private Config() {}
public static Config getInstance() { return INSTANCE; }
}Singleton en serialisatie
Een singleton die eerst wordt geserialiseerd en daarna gedeserialiseerd, levert een nieuwe instantie op tenzij je readResolve() toevoegt die INSTANCE teruggeeft. De enum-aanpak handelt dit automatisch af.
private Object readResolve() { return INSTANCE; }Singleton en reflectieaanvallen
Reflectie kan private constructors aanroepen. Bescherm je hiertegen door in de constructor een uitzondering te veroorzaken als er al een instantie bestaat. Enum-singletons zijn volgens de JVM-specificatie immuun hiervoor.
private Config() {
if (Holder.INSTANCE != null) {
throw new IllegalStateException("Use getInstance()");
}
}Singleton in frameworks voor afhankelijkheidsinjectie
In Spring zijn beans standaard singletons (@Scope("singleton")). Meestal hoef je het singletonpatroon niet zelf te implementeren; laat de container voor afhankelijkheidsinjectie dit beheren.
@Component // Spring manages a single instance
public class FeatureFlags {
private final boolean darkMode = true;
public boolean isDarkMode() { return darkMode; }
}Singletons testen
Singletons zijn moeilijk te testen omdat ze globale toestand bevatten. Geef de voorkeur aan afhankelijkheidsinjectie boven handgeschreven singletoncode en injecteer gesimuleerde instanties in tests via injectie in de constructor.
Korte controle
Welke singletonaanpak raadt Effective Java aan?
Samenvatting
Gebruik voor threadveilige singletons de holder voor initialisatie op aanvraag of de enum-aanpak. Vermijd naïeve luie initialisatie. Laat in Spring-toepassingen het framework het bereikbeheer uitvoeren.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Singleton: threadveilige implementaties” gratis?
Ja — de volledige tekst van “Singleton: threadveilige implementaties” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Singleton: threadveilige implementaties”?
Bouw een threadveilige Singleton met double-checked locking, een enum of het holder-patroon. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Singleton: threadveilige implementaties”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Singleton: threadveilige implementaties
- Factory Method-patroon
- Abstract Factory voor productfamilies
- Builder-patroon met Fluent API