Singleton: trådsikre implementasjoner
Bygg en trådsikker Singleton med dobbeltsjekket låsing, enum eller holder-mønsteret.
Singleton: trådsikre implementasjoner er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Singleton-mønsteret
Singleton sikrer at det bare finnes én instans av en klasse i JVM-en. Vanlige bruksområder er konfigurasjonsbehandlere, tilkoblingsutvalg og loggetjenester.
Naivt Singleton – ikke trådsikkert
Det klassiske late singleton-mønsteret mislykkes ved samtidig tilgang: To tråder kan begge passere nullkontrollen samtidig og opprette to instanser.
public class Config {
private static Config instance;
private Config() {}
public static Config getInstance() {
if (instance == null) { // race condition!
instance = new Config();
}
return instance;
}
}synchronized-metode – enkel, men treg
Hvis du legger til synchronized i getInstance(), blir metoden trådsikker, men den låser ved hvert kall, også etter at instansen finnes – en unødvendig kostnad.
public static synchronized Config getInstance() {
if (instance == null) instance = new Config();
return instance;
}Dobbeltsjekket låsing
Kontroller uten lås, og kontroller deretter på nytt inne i en synchronized-blokk. Feltet må ha volatile for å hindre at instruksjoner omorganiseres.
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;
}
}Initialization-on-Demand Holder
Dette er det sikreste og mest effektive late singleton-mønsteret: En privat, statisk nestet klasse inneholder instansen. JVM-en laster den først når getInstance() kalles for første gang – klasselasting er innebygd trådsikker.
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 anbefaler en enum med én konstant. Den er kortfattet, trådsikker, sikker ved serialisering og beskyttet mot refleksjonsangrep.
public enum AppConfig {
INSTANCE;
private String apiUrl = "https://api.example.com";
public String getApiUrl() { return apiUrl; }
}
// Usage:
String url = AppConfig.INSTANCE.getApiUrl();Tidlig initialisering
Hvis oppstartskostnaden er akseptabel, kan du initialisere instansen når klassen lastes, ved hjelp av et static final-felt. Dette er enkelt og trådsikkert, men instansen opprettes alltid, selv om den aldri brukes.
public class Config {
private static final Config INSTANCE = new Config();
private Config() {}
public static Config getInstance() { return INSTANCE; }
}Singleton og serialisering
Et singleton-objekt som serialiseres og deretter deserialiseres, gir en ny instans med mindre du legger til readResolve() som returnerer INSTANCE. Enum-tilnærmingen håndterer dette automatisk.
private Object readResolve() { return INSTANCE; }Singleton og refleksjonsangrep
Refleksjon kan kalle private konstruktører. Beskytt deg mot dette ved å kaste et unntak i konstruktøren hvis det allerede finnes en instans. Enum-singletons er beskyttet i henhold til JVM-spesifikasjonen.
private Config() {
if (Holder.INSTANCE != null) {
throw new IllegalStateException("Use getInstance()");
}
}Singleton i rammeverk for avhengighetsinjeksjon
I Spring er bønner singletons som standard (@Scope("singleton")). Du trenger sjelden å implementere Singleton-mønsteret manuelt; la DI-beholderen håndtere det.
@Component // Spring manages a single instance
public class FeatureFlags {
private final boolean darkMode = true;
public boolean isDarkMode() { return darkMode; }
}Teste singletons
Singletons er vanskelige å enhetsteste fordi de har global tilstand. Foretrekk avhengighetsinjeksjon fremfor manuell Singleton-kode, og injiser mock-instanser i tester via konstruktørinjeksjon.
Hurtigsjekk
Hvilken singleton-tilnærming anbefales i Effective Java?
Oppsummering
For trådsikre singletons bør du bruke Initialization-on-Demand Holder- eller enum-tilnærmingen. Unngå naiv lat initialisering. I Spring-applikasjoner bør du la rammeverket håndtere scope-administrasjonen.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Singleton: trådsikre implementasjoner» gratis?
Ja – hele teksten i «Singleton: trådsikre implementasjoner» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Singleton: trådsikre implementasjoner»?
Bygg en trådsikker Singleton med dobbeltsjekket låsing, enum eller holder-mønsteret. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Singleton: trådsikre implementasjoner»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Singleton: trådsikre implementasjoner
- Factory Method-mønsteret
- Abstract Factory for produktfamilier
- Builder-mønsteret med Fluent API