2012-07-09 1 views
0

가능한 중복 :
How thread-safe is enum in java?자바 열거 값 집합 스레드 안전

public enum Type 
{ 
    ONE, TWO, THREE, FOUR 
} 

같은 enum 클래스는이 있으라는의 접근에 Type.values() 배열 스레드 안전한가요 for 루프 (예 : 정적 방법)? 예를 들어, 하나는 이들 값의 임의의 부분 집합 정적 배열 변수를 정의하는 경우에는

public static void process() 
{ 
    for (Type type:Type.values()) 
    { 
     // Do something 
    } 
} 

또한, 그 스레드한다 에 금고 읽어? 예를 들어 두 경우

public static final Type[] TYPES = new Type[] {TWO, THREE}; 

public static void process() 
{ 
    for (Type type:TYPES) 
    { 
     // Do something 
    } 
} 

상기 process() 방법은 Typeenum 정의보다 상기 types 어레이의 다른 클래스에 속할 수있다.

또한 TYPES 배열은 Typeenum 한번 정의되고 그 enum의 고정 방법에 의해 반환 될 수있다.

위와 같이 여러 스레드에서 동시에 process() 메서드를 실행하는 경우 코드가 스레드 안전성을 유지합니까 (적어도 TYPES 배열의 값을 읽는 것만 큼)?

+0

나는 그 질문을 읽었으며, 내 것과 동일하지 않습니다. :-) – PNS

+0

어떻게 달라 졌다고 생각하십니까? 나에게도 똑같이 보인다. 열거 형은 Java에서 스레드로부터 안전하다고 보장되므로 런타임시 열거 형 값을 수정할 방법이 없으므로 유형을 반복하는 것이 안전하다는 것을 보장 할 수 있습니다. – jjathman

+0

이것은 내가 실제로 확인하기를 원하는 것입니다. – PNS

답변

1

다른 사람은 이미 values() 메서드 returns a new array each time을 지적 했으므로 스레드로부터 안전합니다.

그러나, 두 번째 질문에 답 : 하나는이 값의 부분 집합 정적 배열 변수를 정의하는 경우

를, 그 스레드 안전 할 것인가? 배열 요소는 항상 변하기 때문에 제 모든public static 배열

은 안전하지 않습니다. 즉, 임의의 스레드는 TYPES[0]을 다른 스레드로 변경할 수 있습니다. Type은 다중 스레드가 있거나 실제로는 단일 스레드 프로그램에서도 안전하지 않습니다.

List<Type>을 노출하는 것이 훨씬 더 좋으며, 안전하게 다시 불변으로 만들 수 있습니다 (예 : Collections.unmodifiableList() 사용).

+0

최대 성능을 위해 배열을 사용하고 있습니다. 배열이 읽기 전용으로 사용되는 경우 스레드로부터 안전합니까? – PNS

+1

@PNS : 저는 스레드와 메모리 안전성에 관해서 항상 보수적 인 자세를 선호합니다. 그리고 어떤 코드가 어딘가에서 언어의 규칙에 따라 가능하다면 가정합니다. 일반적으로,'List' (* values ​​* 컬렉션)이 수행하는 배열 (* variables *의 집합)을 절대로 사용하지 마십시오. 에릭 리 퍼트 (Eric Lippert)의 우수한 기사 [다소 위험하다고 여겨지는 어레이] (http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx)도 참조하십시오. –

+0

당신은 맞습니다. 다만 그것을 읽는 것이 안전합니까? :-) – PNS

1

enum은 스레드로부터 안전합니다. 이들은 변경 불가능합니다. 따라서 스레드는 열거 형 상태를 수정할 수 없습니다.

두 번째 경우로 final으로 정의하면 스레드 안전성이 있으므로 오류 참조를 수정할 수 없습니다.

"참조"만 변경할 수는 없지만 배열 상태는 변경할 수 있습니다.

3

메서드 Type.values()은 매번 새로운 배열을 반환합니다. 이 작업은 배열이 변경 가능하고 스레드로부터 안전 할 때마다 새 복사본을 반환해야하기 때문에 수행됩니다.

+0

정확히 정적 배열에서 values ​​()의 동일한 하위 집합을 다시 사용하면 스레드로부터 안전 할 수 있는지 궁금합니다. – PNS

+0

여러 스레드에서 같은 복사본에 쓰는 것이 유일한 문제입니다. 매번'values ​​()'를 호출하거나 복사본을 수정하지 않으면 문제가 발생하지 않습니다. –

+0

예, 읽기 전용은 스레드로부터 안전합니다. – PNS