【发布时间】: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