我通过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逻辑正常工作,因为它的构造函数只运行一次。这一点很明显,它的构造函数只打印了一次语句。
这种不一致的原因是什么?
答案 0 :(得分:4)
HashSet
不是线程安全的。您需要同步添加或使用适当的并发集合来存储单例。