2012-09-03 3 views
0

안녕하십니까.Java 웹 서비스 용 영구 단일 객체

현재 Apache Tomcat 7 서버에 배포 된 Java Web Service 프로젝트에서 작업 중입니다. 프로젝트의 필요에 따라, 나는 메모리 내의 모든 요청에 ​​의해 생성 된 WS 쓰레드 중에서 글로벌을 유지할 필요가있다. - 서비스 클래스 (객체)

public class SingletonDesign { 
    private static boolean _instanceFlag = false; 
    private static final SingletonDesign _instance = new SingletonDesign(); 
    private static GlobalObject _myGlobalObject; 

    private SingletonDesign() { 
     if(_instanceFlag == false) { 
      _myGlobalObject = new GlobalObject(); 
      _instanceFlag = true; 
     } 
    } 

    public static GlobalObject getModel() { 
     if(_instanceFlag == false) { 
      _myGlobalObject = new GlobalObject(); 
      _instanceFlag = true; 
     } 
     return _myGlobalObject; 
    } 

    public static int parseModel() { 
     if(_instanceFlag == false) { 
      _myGlobalObject = new ItemSimilarityModel(); 
      _instanceFlag = true; 
     } 
     int val = _myGlobalObject.parseFromFile(); 
     return val; 
    } 
} 

내가 요청을 수행 할 때마다 새로운 스레드가 내 웹에 생성 될 수 있다는 사실을 알고 : 따라서, 나는 다음과 같이 단일 디자인 패턴을 구현하기 위해 노력했다. 내 목표는 모든 스레드 중 메모리에 활성 상태로 남아 있으며 한 번만 생성되는 전역 SingletonDesign 개체를 갖는 것입니다. 위의 디자인이 내 기대에 따라 작동하고있는 것처럼 보이지만 사실 일지는 확실하지 않습니다. 그래서 내 질문 :

1) 왜 SingletonDesign 개체의 메서드는 정적이어야합니까? (나는 그들을 정적이 아닌 것으로 정의하려고 시도했지만, 내 Singleton 객체는 제대로 초기화되지 않았다.)

2) 위의 디자인은 싱글 톤 디자인 패턴의 Wikipedia 페이지에서 볼 수 있습니다. 나를 혼란스럽게하는 부분은 다른 Singleton 구현에서도 보았던 _instance 필드의 초기화입니다. 왜 우리가 그 물건을 필요로합니까?

3) 서버가 멈출 때까지 내 개체가 살아 있습니까? 나는 몇 가지 검사를했으며 살아있는 것처럼 보이지만 100 % 확신해야합니다.

시간 내 주셔서 감사합니다.

+1

의존성을 관리하기 위해 Spring을 사용하면 이런 종류의 두통을 줄일 수 있습니다. –

+0

여기서 싱글 톤 패턴을 사용하여 재검토해야합니다. 전역 상태를 도입하면 프로그램을 테스트 할 수없고 신뢰할 수 없게됩니다. 메모리 오버 헤드는 현재 환경에서 문제가되지 않습니다.읽으십시오 : http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons – Peter

답변

2

_instance 필드는 귀하의 싱글 톤을 포함합니다. 정적 getInstance() 메서드가 필요하며 다른 메서드는 인스턴스 메서드입니다. 나는 당신이 _instanceFlag 필드를 필요로한다고 생각하지 않는다. .

SingletonDesign.getInstance() getGlobalObject를(); 다음과 같이

그럼 당신은 그것을 부를 것이다

아직도 많은 사람들 (코드 포함)이 싱글 톤을 코드 냄새라고 생각해보십시오. 또한이 디자인은 Java에서 Singleton을 구현하는 가장 좋은 방법으로 간주되지 않습니다. What is an efficient way to implement a singleton pattern in Java?

객체는 클래스 로더가 활성 상태 인 동안 활성 상태를 유지합니다.

1

1) 실제로 싱글 톤에서 필요한 정적 메서드는 싱글 톤의 인스턴스를 반환하는 메서드입니다. 싱글 톤을 인스턴스화 할 수 없으므로 메서드가 정적이어야하므로 메서드는 개체 대신 클래스에 속해야합니다.

2)로 시작하는 것이 더 쉬울 수있는 단순화 된 버전 : 제가 알기로

public class MySingleton { 

    private static MySingleton instance = null; 
    private static String aString = null; 

    private MySingleton({ 
     aString = new String("Hello, world"); 
    } 

    public static MySingleton getInstance() { 
     if (instance == null) { 
      instance = new MySingleton(); 
     } 

     return instance; 
    } 

    public string getMyString() { 
     return aString; 
    } 
} 

3) 인은 한 JVM이 실행 살아 남아 있습니다.

팁으로 인스턴스를 반환하는 메서드에서 일종의 초기화 코드를 수행하는 경우 메서드를 synchronized로 선언하는 것이 좋습니다.