HashSet存储Singleton对象两次

时间:2013-09-04 06:51:18

标签: java multithreading collections singleton

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

My Singleton Class是: -

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,它为Main Class的线程提供run方法: -

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逻辑正常工作,因为它的构造函数只运行一次。这一点很明显,它的构造函数只打印了一次语句。

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

1 个答案:

答案 0 :(得分:4)

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