【问题标题】:HashSet storing Singleton object twiceHashSet 存储 Singleton 对象两次
【发布时间】:2013-09-04 06:51:17
【问题描述】:

我通过 10,000 个线程在 HashSet 中存储一个 Singleton 对象(即 10,000 次)。令人惊讶的是,有时 HashSet 无法识别 Object 是 Singleton 并且两次存储相同的对象实例。有时,它存储对象一次,但它的 size() 方法返回值 2 或 3。

我的单身班级是:-

public class Singleton {

  private Singleton() {

    System.out.println("Singleton--- It runs just once");

    }

   private static class StageSingletonHolder {

    static Singleton instance = new Singleton();

    }


   public static Singleton getInstance() {

    return StageSingletonHolder.instance;
  }


 }

为主类线程提供运行方法的RunObject:-

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


 public class RunObject implements Runnable{
  Singleton singleton;
  public static Set<Singleton> set = new HashSet<Singleton>();


  public void run(){

      singleton = Singleton.getInstance();
      set.add(singleton);       
    }



    public int numberOfSingletons(){

    for(Singleton single:set){

        System.out.println(single);

        }

    System.out.println("set size : "+set.size());

   }

 }

我的主要课程是:-

  public class MainObject {

   public static void main(String[] args){
   RunObject runObject = null;
   Thread t;
   int i = 0;
   while(i++ < 10000){
    runObject = new RunObject();
    t = new Thread(runObject);
    t.start();
    }

  }
 }

这里,在某些情况下,同一个对象被存储不止一次。 我知道单例逻辑可以正常工作,因为它的构造函数只运行一次。其构造函数只打印一次语句就可以看出这一点。

这种不一致的原因可能是什么?

【问题讨论】:

  • 您的班级Singleton 是否实现了hashCode()(和equals())方法?可能单例实例的哈希码会随着时间而变化
  • @MrD,感谢您的回复。先生,您能告诉我为什么必须实现 hashCode 和 equals 方法吗?为什么单例实例的hashCode会随时间变化?
  • hashCode() 方法不会随时间自动更改,如果您没有覆盖它。

标签: java multithreading collections singleton


【解决方案1】:

HashSet 不是线程安全的。您需要同步添加或使用适当的并发集合来存储单例。

【讨论】:

  • 先生,非常感谢您的回答
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多