2013-06-15 1 views
4

이 ENUM 코드 스레드 안전합니까?이 ENUM 메서드는 thread safe입니까?

enum One{ 
    IONE; 
    public mone(){ 
     // some code 
    } 
} 

위의 코드가 안전하지 않은 경우?

+6

이 코드는 아무 것도하지 않으므로 예입니다. –

+1

이 코드는 컴파일 할 수 없습니다. 'mone'에게 리턴 타입을줍니다. –

+0

이것 좀보세요 : http://stackoverflow.com/questions/2531873/how-thread-safe-is-enum-in-java –

답변

4

열거 형 값은 사용되기 전에 단일 스레드에 의해 한 번만 초기화된다는 보장이 있습니다. 그러나 열거 형 클래스에 추가하는 메서드는 스레드 안전성 보증을 수행하지 않습니다. 메서드가 상태를 변경하지 않도록 열거 형을 사용하는 경우 정의에 따라 스레드가 안전합니다.

+0

인스턴스 변수가 없으면 메소드가 있어도 스레드로부터 안전할까요? ? – arjun

1

메서드 자체가 인 경우에만 해당합니다.

열거 형은 특별하게 취급됩니다

  • 클래스가로드 될 때 초기화된다 (당신이 주석에서 사용할 수있는 이유입니다);
  • 항상 final입니다.
  • 열거 형 값은 항상 static final입니다.
0

mone에서 One 열거에는 공유 데이터, 모든 변수 (반환 유형을 필요로하는)이 없습니다 지역 사람들이다. 따라서 내용은 모두 mone에 따라 다릅니다. 이 메서드가 다른 클래스의 상태가있는 싱글 톤을 사용하면 문제가 발생할 수 있습니다.

+0

코드에 대해 더 자세히 설명 할 수 있습니까? '이 메서드가 다른 클래스의 상태와 싱글 톤을 사용하면 문제가 발생할 수 있습니다.' – arjun

+0

죄송합니다 - 오타가 너무 많습니다. Joshua Bloch가 "Effective Java"로 대중화 한 열거 형 중 하나를 사용하면이 열거 형을 열거 형의 유일한 구성원으로 변환 할 수 있습니다. 그런 다음 동일한 '싱글 톤'클래스를 만드는 것은 불가능합니다. 그러나 사람들이 이러한 단일 열거 형 변경 가능한 데이터를 제공하거나 변경 가능한 데이터가있는 객체의 메서드를 호출하는 것을 보았습니다. 명시 적 동기화가 없으면 열거 형에 액세스하는 두 스레드가 서로 간섭 할 수 있습니다. 따라서 싱글 톤을 열거 형으로 사용하려면 데이터를 변경할 수 없도록 설정하십시오. –

+0

당신이 설명한 문제는 사실 Enum이 구현 한 Singleton 자체와 아무 관련이없는 것처럼 보입니다. 이 동시성 문제는 구현이 멀티 스레딩 단계를 제대로 처리하지 않는 한 모든 종류의 Singleton에 영향을 미칠 수 있습니다. 그것은 실제로 자바 동시성 문제입니다. – hackjutsu

관련 문제