2013-09-04 2 views
0

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 논리가 올바르게 작동한다는 것을 알고 있습니다. 이것은 생성자가 문장을 한 번만 인쇄하면 분명합니다.

이러한 불일치의 원인은 무엇일까요?

+1

클래스'Singleton'은'hashCode()'(그리고'equals()') 메소드를 구현합니까? 아마도 singleton-instance의 해시 코드가 시간이 지남에 따라 변경됩니다. – MrD

+0

@ MrD, 답장을 보내 주셔서 감사합니다. 선생님, hashCode 및 equals 메서드를 구현하는 것이 필수적인 이유는 무엇입니까? 싱글 톤 인스턴스의 hashCode가 시간이 지남에 따라 변경되는 이유는 무엇입니까? – user961690

+0

'hashCode()'메소드가 오버라이드하지 않으면 시간이 지남에 따라 자동으로 변경되지 않습니다. – Jesper

답변

4

HashSet은 스레드로부터 안전하지 않습니다. 추가를 동기화하거나 싱글 톤을 저장하기 위해 적절한 동시 콜렉션을 사용해야합니다.

+0

선생님, 답변 해 주셔서 감사합니다. – user961690

관련 문제