2014-12-09 5 views
3

JVM에서 최종 변수를 다르게 처리하는 방법은 무엇입니까?JVM이 클래스의 최종 변수로 수행하는 작업은 무엇입니까?

+0

관련 항목 : http://stackoverflow.com/q/3697988/3651800 –

+1

질문 대상은 무엇입니까? 상황은 다음과 같습니다. 다중 스레드 코드에서 값을 다시 읽을 필요가없는 등, 값이 최적화를 위해 변경되지 않는다는 지식을 사용합니다. – zapl

+0

@MattCoubrough : 관련되었지만 중복되지 않았습니다. 그 밖의 질문은 * static final *에 관한 것입니다. – Thilo

답변

4

이 메모리 모델에 final의 영향에 대한 JVM 사양의 적어도 하나 개의 섹션이며, 멀티 스레드 코드를 매우 중요하다 : 객체의

final 필드 "safe publication" 수 :

  • 생성자가 종료되면 모든 스레드에서 모든 final 필드를 볼 수 있어야합니다.
  • final 참조를 통해 액세스 된 모든 개체의 필드는 최소한 생성자가 종료 될 때 최신 날짜가되도록 보장됩니다.
  • 함께 사용하면 모든 필드가 final이고 변경 불가능한 개체 (프리미티브 또는 변경 불가능 개체 참조)가 동기화없이 동시에 액세스 될 수 있음을 의미합니다. final 참조를 통해 실제로 "불변"객체 (필드가 실제로 final이 아니지만 실제로는 변경되지 않는 객체)를 읽는 것도 안전합니다.
  • 반대로 : 개체에 여러 스레드가 액세스하고 그 필드를 final으로 선언하지 않은 경우 다른 방법으로 스레드 안전성을 제공해야합니다.

참고 : JVM은 실제 최종을 적용하지 않습니다. 리플렉션을 사용하여 값을 다시 할당 할 수 있습니다 (물론 안전한 게시를 방해 할 수 있음).