测试“单例模式”的作用域是线程还是进程

来源:互联网 发布:爬虫数据采集解决方案 编辑:程序博客网 时间:2024/05/23 11:55

提出问题

在学习的过程中,在朋友问我的一个问题中,我突然想到我们经常说的单例模式,也就是通常说的只能存在这样一个对象的问题,我突然想,它的这个对象是在一个线程中只能有一份,还是在这个进程中只能够有一份呢?

解决的思路

最好的解决办法就是在一个程序中,创建两个线程,获取同一个单例对象,然后通过比对看着两个对象是不是同样的一个对象即可。

实际结果

创建单例类

首先简单创建一个单例的类,用于后面对单例的测试:

package cn.beixiansheng.single;public class SingleA {    private static SingleA single;    private SingleA() {    }    public static SingleA getInstance() {        if (single == null) {            single = new SingleA();        }        return single;    }    public void test() {    }}

下面是进行测试验证的方法

package cn.beixiansheng.single;public class Test {    public static void main(String[] args) {        SingleA singleA = SingleA.getInstance();        System.out.println(singleA);        new Thread() {            public void run() {                SingleA singleB = SingleA.getInstance();                System.out.println(singleB);            };        }.start();    }}

在上面的方法里面,有两个线程,在两个线程里面都通过单例类的静态方法获取这个单例的对象。
分别使用toString方法来输出各个线程中使用的对象的哈希码,在很大程度上就能够通过看它是否相同判断是不是一个对象了

我的测试结果显示

我的测试结果展示如下:

cn.beixiansheng.single.SingleA@15db9742cn.beixiansheng.single.SingleA@15db9742

可以看到这两个对象的哈希码是完全一样的(可能每个人的值并不一样,我对java生成哈希码原理不了解,因此这里不敢确定),也就是基本上它们就是一个对象;如果觉得存在随机性可能,可以多测试几次。

作者联系方式(微信号码):
邮箱:cn_newer@163.com

我的微信号

0 0
原创粉丝点击