Java实现单例模式

发布时间 2023-12-27 10:22:24作者: yan061

饿汉式
静态常量饿汉式的优点是:在类装载的时候就完成实例化,没有达到Lazy Loading的效果,并且避免了线程同步问题。

它的缺点是:如果从始至终从未使用过这个实例,则会造成内存的浪费。


public class adaDemo3 {

    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance1==instance);
        System.out.println(instance1.hashCode());
        System.out.println(instance.hashCode());
    }
}

class Singleton{

    private final static Singleton instance = new Singleton();

    private Singleton (){}

    public static Singleton getInstance(){
        return instance;
    }
}

懒汉式(双重检查)
效率可以,线程安全,推荐使用。

class Singleton{

    private static Singleton instance;

    private Singleton (){}

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

懒汉式(静态内部类)
利用JVM加载类时是线程安全的机制,推荐使用。

class Singleton{

    private Singleton (){}

    private static class InternalClass{
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance(){
        return InternalClass.instance;
    }
}

枚举类

public class adaDemo3 {

    public static void main(String[] args) {

        Singleton instance = Singleton.INSTANCE;
        Singleton instance1 = Singleton.INSTANCE;
        System.out.println(instance1==instance);
        System.out.println(instance1.hashCode());
        System.out.println(instance.hashCode());
        instance.test();
    }
}

enum Singleton{

    INSTANCE;

    void test(){
        System.out.println("test");
    }
}