我通过 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();
}
}
}
在这里,在某些情况下,同一个对象被存储不止一次。我知道单例逻辑可以正常工作,因为它的构造函数只运行一次。其构造函数只打印一次语句就可以看出这一点。
这种不一致的原因可能是什么?