2013-08-08 5 views
0
public class ConnectionManager { 

    private static Map <String, ConnectionManager> managerInstances = new HashMap<String, ConnectionManager>(); 

    private String dsKey; 
    private ConnectionManager(String dsKey){ 
     this.dsKey = dsKey; 
    } 

    public static ConnectionManager getInstance(String dsKey){ 
     ConnectionManager managerInstance = managerInstances.get(dsKey); 

     if (managerInstance == null) { 
      synchronized (ConnectionManager.class) { 
       managerInstance = managerInstances.get(dsKey); 
       if (managerInstance == null) { 
        managerInstance = new ConnectionManager(dsKey); 
        managerInstances.put(dsKey, managerInstance); 
       } 
      } 
     } 
     return managerInstance; 
    } 
} 

최근 GoF에서 책 정의에 따라 Singleton 패턴이 사용되지 않은 어딘가에서이 코드를 보았습니다. 싱글 톤은 Map의 자체 인스턴스를 저장합니다.어떤 종류의 싱글 톤입니까?

어떤 종류의 싱글 톤이 호출 될 수 있습니까? 아니면 이것이 Singleton의 유효한 사용입니까?

+0

@assylias 설명이 마음에 들지는 않지만 – MadProgrammer

답변

9

싱글 톤이 아닙니다. 그것은 multiton pattern입니다.

응용 프로그램 당 단일 인스턴스 이 오히려보다는 멀티 톤 패턴 대신 키 당 단일 인스턴스 을 보장합니다.

3

Java에서 스레드 안전하지 않은 double-checked locking 이디엄을 사용하여 멀티 톤이 손상된 것 같습니다. 특히 getInstance(s)을 호출 할 때 s이 null이 아닌 문자열 인 경우 dsKey이 null 인 ConnectionManager을 가리키는 null이 아닌 참조를 수신 할 수 있습니다.

대신 스레드 안전 ConcurrentHashMap을 사용하여 동기화 필요성을 제거하는 것이 훨씬 더 좋습니다.

+1

스레드 안전성에 관해서는 프로그래머가 생각한대로 모든 잠금 기능이 작동한다고해도 스레드 안전성이 떨어집니다. 다른지도를 쓰는 동안지도에서 하나의 스레드가 나오고 별이 정렬되고 [무한 루프로 끝날 수 있습니다] (http://mailinator.blogspot.com/2009/06/beautiful) 바로 시간을 맞춰보세요. -race-condition.html). 우리가 "부패", 사람들을 말할 때 우리가 이야기하고있는 데이터가 가끔 분실되거나 중복되는 것은 아닙니다. : P – cHao

+0

@cHao 그래, 내가 그 중요한 점을 알아 차리기 전에 나는 그만 두었다. – assylias

+0

이중 검사 잠금은 '휘발성'으로 스레드 안전성을 유지할 수 있습니다. http://en.wikipedia.org/wiki/Double-checked_locking을 참조하십시오. – mike

관련 문제