关于双重检验锁方法和内部类方法实现单例模式的实验

Posted 掌握当下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于双重检验锁方法和内部类方法实现单例模式的实验相关的知识,希望对你有一定的参考价值。

网上很多人说,使用双重检验锁方法实现单例模式可能会new多个实例,而内部类方法和枚举类方法完美解决了这个问题

因为android很少使用枚举,本次只研究双重检验锁方法和内部类方法

双重检验锁方法:

代码如下:

public class SingletonB {
    private static volatile SingletonB mInstance;

    private SingletonB() {
        System.out.println("双重检验锁方法单例模式");
    }

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

内部类方法:

代码如下:

public class SingletonA {
    private SingletonA() {
        System.out.println("内部类方法单例模式");
    }

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

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

在多线程环境下分别使用这两种单例模式

测试代码:

public class Test {

    public static void main(String[] args) {
        Thread[] threads = new Thread[10000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread() {
                public void run() {
                    SingletonA.getInstance();
                    SingletonB.getInstance();
                };
            };
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
    }

}

运行结果

运行了N次,两个单例模式都是只运行了一次构造函数。

其实我的期望是能出现双重锁方法的bad case,但是并没有出现。本次实验失败,下次再接再厉。

以上是关于关于双重检验锁方法和内部类方法实现单例模式的实验的主要内容,如果未能解决你的问题,请参考以下文章

单例模式-懒汉式(双重检验)

设计模式之单例模式详解(java)

设计模式之单例模式详解(java)

设计模式-单例模式

如何实现一个单例模式 c#双重锁检查

单例模式的七种实现