2012-06-18 5 views
2
class EverythingMustBeInAClass 
{ 
    private final int i = 42; 
    private final int[] a = {2, 3, 5, 7, 11, 13, 17, 19}; 
} 

i 모든 스레드 (0 대신에) 동일한 int 값 42을 참조 final 것을 보장 선언 사실.다중 스레드 액세스 배열

a이 선언 된 사실 final은 모든 스레드가 동일한 배열을 참조하도록 보장합니다. 참조.

하지만 모든 스레드가 동일한 배열을 참조하는지 확인하려면 요소 (0 대신)? 나중에 어레이 요소를 변경하려고하지 않더라도 배열에 대한 액세스를 동기화해야합니까?

답변

5

final은 배열 참조가 표시 될뿐만 아니라 객체 자체가 완전히 구성되고 초기화되었음을 보장합니다. 따라서 배열의 값은 모든 스레드에서 볼 수 있습니다.

http://www.javamex.com/tutorials/synchronization_final.shtml

인용하기 : 최종 참조를 통해 액세스 개체에

필드도에서 보장하는

여기에 주제에 대한 좋은 링크입니다 적어도 생성자가 종료 할 때까지 최신 상태로 유지해야합니다.

그러나,이 a 배열 인 것이 중요합니다 하지 불변 때문에, 예를 들어, 당신은 a[0] = 10을 설정할 수 및 해당 업데이트가 동기화되지 않습니다. 그러나 당신이 이 아니면의 값을 변경하면 a에 좋을 것입니다.

1

내용을 변경하지 않으려면 "의미가 있기 전에 발생합니다"및 최종으로 인해 안전합니다.

0

아니요 데이터 구조에서 final 키워드를 사용하는 경우 액세스를 동기화 할 필요가 없습니다. 변수에 쓰지 않는 한 필요한만큼 많은 동시 읽기를 가질 수 있습니다. 최종 키워드를 사용하지 않는 경우 변수에 액세스하려면 언제든지 변수를 잠글 필요가 있습니다.