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

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

由于Android不多使用枚举,本次只研究双重检验锁方法和内部类方法

双重检验锁方法:

代码以下: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,可是并无出现。本次实验失败,下次再接再砺。

相关文章
相关标签/搜索