qq_18360395 2016-06-28 09:29 采纳率: 0%
浏览 1071

java关于HashSet的一点疑惑,请大神指点一下~~

 我在一个单例模式的测试中,把get到的对象放在HashSet中,利用Set集合的去重,来观察究竟生成的是否为一个实例,但结果却让我很不解,求大家指点,先把代码贴出来。

Singleton.java:

 package test;

public class Singleton {

    private static Singleton instance = null;
    // 记录执行了几次new Singleton
    private static int count = 0;

    private Singleton() {
        count++;
    }

    public static int getCount() {
        return count;
    }

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

Test.java:

 package test;

import java.util.HashSet;
import java.util.Set;

public class Test {

    //创建HashSet结合
    private static Set<Singleton> set = new HashSet<Singleton>();

    public static void main(String[] args) {

        //创建实现Runnable接口的对象
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                Singleton instance = Singleton.getInstance();
                set.add(instance);
            }
        };

        //循环启动线程10000次
        for (int i = 0; i < 10000; i++) {
            new Thread(runnable).start();
        }

        //输出结果
        System.out.println("set.size() == " + set.size());
        System.out.println("set contains : " + set);
        System.out.println("Singleton.count == " + Singleton.getCount());

    }
}

输出结果很奇怪,

每次执行main方法后,输出的set.size()值都是不固定的,基本在1-5之内随机。

但直接控制台输出 set ,里边看到只有一个对象。

Singleton.getCount()方法的输出也永远是1。

不明白为什么第一个输出set.size是什么情况。

结果贴图出来:
执行结果

  • 写回答

3条回答 默认 最新

  • 程序员无名 2016-06-28 09:45
    关注
     public
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制