2011-03-06 6 views
2

를 작성 하는가 : 싱글 인스턴스 테스트 휘발성이 될를 선언함으로써는 다음 싱글 가정 휘발성 클래스 보증 휘발성 클래스 변수

public class Test{ 
    private static volatile Test test = null; 
    private static int test_int = 0; 
    private static String test_string = "test"; 

    public int getInt(){ 
     return test_int; 
    } 

    public String getString(){ 
     return test_string; 
    } 

    private static Test getInstance(){ 
     if(test == null){ 
      synchronized(Test.class){ 
       if(test == null) 
        test = new Test(); 
      } 
     } 
    } 

을 test_int 및 test_string 또한 휘발성로 간주됩니다하거나이 같은 선언해야? 나는 클래스 자체를 휘발성으로 만드는 것으로 생각하고 싶다. 그리고 그 클래스 아래의 모든 것은 휘발성 일 것이다 ... 그러나 나는 이것에 대해 확신하지 않는다. 미리 감사드립니다.

답변

9

아니요, 휘발성 물질로 간주되지 않습니다. test 변수 만 휘발성입니다. test 값을 얻은 후에 (getInstance 통해) 그 변동성은 클라이언트의 나머지 동작과 관련이 없습니다.

개인적으로는 volatile 대신 AtomicIntegerAtomicReference을 사용하는 것이 좋습니다. 나는 다른 누구도 알지 못하지만 불안정한 행동을 믿을만하게 추론하기가 어렵습니다. 당신은 아마 당신의 test_inttest_string 변수는 정적 싶지 않아

주 ...

+0

1 : 당신은 안전 작업을 처리하는 AtomicInteger, AtomicLong 또는 AtomicReference 같은 래퍼를 사용하는 것을 동의합니다. 당신이 지역 변수보다는 휘발성 필드만을 가질 수 있다는 것이 단점입니다. ;) –

+0

위 예제에서 AtomicInteger와 AtomicReference를 사용하는 방법은 무엇입니까? – Deepak

+0

@Deepak : 최종 AtomicInteger (또는 무엇이든) 변수를 만든 다음 래핑 된 값을 원자 적으로 변형시키는 객체입니다. –