首页 > 其他 > 详细

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

时间:2018-05-31 02:09:50      阅读:225      评论:0      收藏:0      [点我收藏+]

网上很多人说,使用双重检验锁方法实现单例模式可能会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,但是并没有出现。本次实验失败,下次再接再厉。

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

原文:https://www.cnblogs.com/shenchanghui/p/9114283.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!