HashSet에 10,000 개의 스레드 (예 : 10,000 번)를 통해 싱글 톤 객체를 저장합니다. 놀랍게도 HashSet은 Object가 Singleton임을 인식하지 못하고 동일한 객체 인스턴스를 두 번 저장합니다. 그리고 때때로, 그것은 한 번 개체를 저장하지만, 크기() 메소드는 2 개 또는 3싱글 톤 객체를 두 번 저장하는 HashSet
내 싱글 톤 클래스는 값 반환 -
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 논리가 올바르게 작동한다는 것을 알고 있습니다. 이것은 생성자가 문장을 한 번만 인쇄하면 분명합니다.
이러한 불일치의 원인은 무엇일까요?
클래스'Singleton'은'hashCode()'(그리고'equals()') 메소드를 구현합니까? 아마도 singleton-instance의 해시 코드가 시간이 지남에 따라 변경됩니다. – MrD
@ MrD, 답장을 보내 주셔서 감사합니다. 선생님, hashCode 및 equals 메서드를 구현하는 것이 필수적인 이유는 무엇입니까? 싱글 톤 인스턴스의 hashCode가 시간이 지남에 따라 변경되는 이유는 무엇입니까? – user961690
'hashCode()'메소드가 오버라이드하지 않으면 시간이 지남에 따라 자동으로 변경되지 않습니다. – Jesper