Fundamentals 7 min read

Understanding the Singleton Pattern in Java: Concepts, Implementations, and Applications

This article introduces the Singleton design pattern in Java, explains its purpose of ensuring a single class instance, presents multiple implementation approaches—including eager, lazy, double-checked locking, static inner class, and enum—with code examples, and discusses practical usage scenarios and recommendations.

Full-Stack Internet Architecture
Full-Stack Internet Architecture
Full-Stack Internet Architecture
Understanding the Singleton Pattern in Java: Concepts, Implementations, and Applications

The Singleton pattern is one of the simplest and most widely used creational design patterns in Java, ensuring that a class has only one instance and providing a global access point.

Implementation Idea : Make the class constructor private, prevent external instantiation via new, and expose a static method that returns the unique instance.

Example of a basic singleton class:

public class SingleObject {

    // single instance
    private static SingleObject instance = new SingleObject();

    // private constructor prevents external instantiation
    private SingleObject() {}

    // global access point
    public static SingleObject getInstance() {
        return instance;
    }

    public void showMessage() {
        System.out.println("Hello World!");
    }
}

Client code obtains the instance via SingleObject.getInstance() and calls its methods.

Various Implementation Variants :

Lazy (non‑thread‑safe) : Instance created on first call; not safe for multithreading.

Lazy (thread‑safe with synchronized) : Adds synchronized to the accessor; safe but incurs performance cost.

Eager initialization : Instance created at class loading time; simple and fast but may waste memory.

Double‑checked locking : Uses a volatile instance and synchronized block to achieve lazy loading with high performance.

Static inner class : Leverages class‑loader mechanics for lazy, thread‑safe initialization.

Enum : The most robust approach; provides serialization safety and guarantees a single instance.

Each variant is illustrated with Java code snippets (shown in pre blocks above).

Practical Application : The Java Runtime class is a classic singleton example using eager initialization.

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    private Runtime() {}

    public static Runtime getRuntime() {
        return currentRuntime;
    }
    // ... other methods ...
}

In most cases, the eager, static‑inner‑class, double‑checked locking, or enum implementations are recommended, while the simple lazy versions are generally discouraged.

Conclusion : Prefer eager or static‑inner‑class approaches for simplicity and performance; use double‑checked locking when lazy loading is required; consider the enum method for serialization safety.

References : Includes links to tutorials and articles on design patterns and related topics.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

Javaconcurrencydesign patternObject-Oriented
Full-Stack Internet Architecture
Written by

Full-Stack Internet Architecture

Introducing full-stack Internet architecture technologies centered on Java

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.