banner
Tenifs

Tenifs

雄关漫道真如铁,而今迈步从头越。
github
follow
zhihu
email

Java Implementation of Singleton Pattern

The singleton pattern ensures that a class has only one instance and provides a global access point.

In Java, there are several common methods to implement the singleton pattern.

Eager Initialization#

The eager initialization creates an instance when the class is loaded, which is thread-safe but may waste memory.

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    // Private constructor to prevent external instantiation
    private Singleton() {}

    // Provide a global access point
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

Lazy Initialization (Not Thread-Safe)#

The lazy initialization creates an instance when getInstance() is first called, which is not thread-safe.

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Lazy Initialization (Thread-Safe)#

By using a synchronized method, it ensures that there is only one instance even in a multi-threaded environment.

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

Double-Checked Locking#

It checks whether an instance has been created both inside and outside the synchronized block, reducing synchronization overhead.

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Static Inner Class#

Using a static inner class ensures thread safety and lazy loading.

public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

Enum#

The simplest implementation method, recommended to use. It is thread-safe, supports serialization, and prevents reflection attacks.

public enum Singleton {
    INSTANCE;

    public void someMethod() {
        // Instance method
    }
}

References#

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.