2015-01-23 7 views
0

우리는 Java에서 스레드 안전 싱글 톤 클래스를 사용한다고 가정합니다.이 클래스는이를 사용하는 가장 좋은 방법입니다. 예를 들어, 우리가 싱글 톤 클래스가 있는지 고려해Java에서 싱글 톤을 사용하는 가장 좋은 방법

public class MySingleTon { 
    // my thread-safe code goes here 
} 

을 다음과 같이 우리는 두 가지 방법으로 위의 싱글 톤을 사용하는 서비스 클래스가 있습니다

1 :

public class MyService { 
    MySingleton singleton; 

    public void myMethod1() { 
     singleton = MySingleton.getInstance(); 
     // code ... 
    } 

    public void myMethod2() { 
     singleton = MySingleton.getInstance(); 
     // code... 
    } 
    public void myMethod3() { 
     singleton = MySingleton.getInstance(); 
     // code... 
    } 
} 

또는

2 :

public class MyService { 

    public void myMethod1() { 
     MySingleton singleton = MySingleton.getInstance(); 
     // code ... 
    } 

    public void myMethod2() { 
     MySingleton singleton = MySingleton.getInstance(); 
     // code... 
    } 
    public void myMethod3() { 
     MySingleton singleton = MySingleton.getInstance(); 
     // code... 
    } 
} 

싱글 톤이 인스턴스 변수를 통해 참조되는 경우와 경우 2에서 싱글 톤은 메소드 로컬 변수로 참조됩니다. 위의 스 니펫이 멀티 스레드 환경에서 사용되는 것을 고려하면 더 나은 옵션이며 그 이유는 무엇입니까?

+0

이 질문은 우리가 당신의 싱글 톤에 대한 세부 사항을 알지 못하고 정확히 어떻게 사용할지 모르기 때문에 매우 광범위합니다. 예를 들면 : 싱글 톤 인스턴스가 변경 가능하고,'myMethod'가 싱글 톤의 상태를 변경하려고합니까, 동기화 될 수 있습니까? – Pshemo

+0

내가 thread-safe (변경할 수없는 상태에 동기화 된 액세스로 변경 가능하거나 변경할 수 없음) 할 때 모든 경우를 다루지 않습니까? 아니, 여기에 당신의 질문을 훼손하고 있지만, 내가 여기에 아무것도 놓친 경우에만 궁금해. – user3244615

+0

어떤 클래스가 thread-safe로 간주된다고해도, thread가 안전하지 않은 방식으로 사용할 수 있습니다. 예를 들어,'method1'은 자신의 singleton 상태를 설정하고이 상태가 그대로 유지된다는 가정하에 다른 작업을 수행 할 수 있습니다. 그러나 동시에'method2'는이 상태를 다른 것으로 바꾸려고 시도 할 수 있습니다. 그것은 당신의 경우에 문제가 될 것입니까? 가능할까요? – Pshemo

답변

2

나는 그것을 세 번째 방법 모든 경우에

public class MyService { 
    final static MySingleton singleton = MySingleton.getInstance(); 

    public void myMethod1() { 
     // code ... 
    } 

    public void myMethod2() { 
     // code... 
    } 
    public void myMethod3() { 
     // code... 
    } 
} 

내 의견에 더 좋을 것이다 스레드 안전

+1

은 심지어 일정한 IMHO –

+0

예요. 정적 일 수 있습니다. –

0

2에서 차이가 없습니다를 정의하는 것입니다. 싱글 톤 인스턴스를 죽이고 필요한 경우 다시 생성 (즉, 자체 감지 데드락 또는 자원 경합 완화) 할 수있는 자유를 제공합니다 (MySingleton).

+0

첫 번째 경우에 교착 상태가 발생할 가능성이 있습니까 ?? – user3244615

+0

스레드 안전 코드에 버그가 없으면 no입니다. 그러나, 그것은 큰 경우입니다. –

+0

전적으로 동의합니다. 정말 큰 경우. :) – user3244615