0

我通过 HashSet 中的 10,000 个线程(即 10,000 次)存储一个 Singleton 对象。令人惊讶的是,有时 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();
    }

  }
 }

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

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

4

1 回答 1

4

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

于 2013-09-04T07:04:45.300 回答