2011-03-02 6 views
11

배열을 휘발성으로 만들려면 어떻게해야합니까? 왜냐하면 내가 알기 론 배열이 휘발성이되게하는 것이 안전하지 않기 때문입니까?Java 휘발성 배열?

+2

http : //jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html –

답변

13

배열을 volatile로 선언해도 해당 필드에 일시적으로 액세스 할 수는 없습니다. 당신은 참조 자체를 휘발성이 아니라 요소라고 선언하고 있습니다.

은 즉 당신은 요소, 휘발성 요소하지 세트의 휘발성 세트를 선언하고 있습니다. 여기 해결책은 정수를 사용하려는 경우 AtomicIntegerArray를 사용하는 것입니다. 또 다른 방법 (그러나 좀 추한)는 필드를 편집 배열에 대한 참조 때마다 다시 작성하는 것입니다

당신이 할 그 (내가 ... 말했다 못생긴)

arr = arr; 

+2

휘발성 요소는 요소의 액세스가 원자 적이라고 생각하지 않습니다. – Blindy

+0

맞습니다. '휘발성'은 일찍 발생하는 관계를 보장하는 것입니다. – mike

6

로 AtomicLongArray, AtomicIntegerArray, AtomicReferenceArray (java.util.concurrent.atomic)입니다.

1

편집 : 배열은 자바 객체. 해당 객체에 대한 참조를 휘발성으로 만들면 배열에 대한 참조를 다른 스레드로 볼 수있게됩니다. 그러나 배열 값 자체에는 해당되지 않습니다. 자바 메모리 모델의 더 나은 unterstanding 얻기

는 실제로 원자 * 배열하지 않고 주위에 얻을 수있는 가능성이있다. 휘발성의 일이-전에 관계를 사용하여 읽기 및 일반 쓰기가 가능하게한다 : 스레드 A는 일부 비 휘발성 물건과 스레드 B는 휘발성 재료의 변화를 볼 수 보장, 후 휘발성 변수 를 기록

경우 뿐만 아니라 스레드 B가 휘발성 변수를 먼저 읽어야합니다. 또한 참조 : 배열 Happens-before relationships with volatile fields and synchronized blocks in Java - and their impact on non-volatile variables?

, 이것이 의미 : 당신이 배열에 기록 후 가 일부 휘발성 상태 변수에 쓰기 (쓰기 실제로 휘발성 상태 변수를 변경해야합니다!) 어레이에서 읽을 때 휘발성 상태 변수를 먼저 읽은 다음 배열에 액세스하십시오. 휘발성 읽기는 이전에 발생한 모든 다른 쓰기도 볼 수있게해야합니다.

OLD : arr=arr 실제로 도움이되지 것 자체 기준을 작성.

당신은 배열 arr 필드 arr[i] 아닌 값의 주소를 작성합니다. 따라서 여전히 arr[i]에 대한 휘발성 속성은 없지만 저장소 주소는 arr입니다.

제레미 맨슨의 이전에 언급 한 블로그 게시물은 자세하게 설명 : http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html

그의 가장 좋은 방법은 원자 * 배열, 일반적인 유형, 즉의 AtomicReferenceArray를 (또한 기본 유형에 대한 특별한 형태의 존재가) 사용하는 것입니다. 특히 이것이 더 많은 속성을 필요로 할 때 특히 효율적이라고 상상할 수 없습니다 (원자 성 >> 휘발성).

대안은 컨테이너가 휘발성 포인터 필드를 사용하는 점으로 구분 된 구조 일 수 있습니다. 또한 그 효율적인 ...