[면접] 볼라틸이 무슨 소용이야? - -Java 기본 사항

1374 단어 면접 시험

volatile는 무슨 소용이 있습니까?


 
코드를 synchronized로 성명
일반적으로 이 코드의 원자성atomicty와 가시성visibility를 가리키는 두 가지 중요한 결과가 있다.
  • 원자성은 이 시간에 하나의 라인만 코드를 실행할 수 있다는 것을 의미한다. 이 코드는 하나의 모니터 object를 통해 보호된다.따라서 여러 라인이 공유 상태를 업데이트할 때 서로 충돌하는 것을 방지한다.
  • 의 가시성은 더욱 기묘하다. 그는 자물쇠를 풀기 전에 공유 데이터에 대한 변경이 그 다음에 이 자물쇠를 얻은 다른 라인에 대해 볼 수 있도록 확보해야 한다. 만약에 동기화 메커니즘이 제공하는 이런 가시성 보증이 없다면 라인이 보는 공유 변수는 수정 전의 값이나 일치하지 않는 값일 수 있기 때문에 많은 심각한 문제를 일으킬 것이다.

  • volatile 사용 조건
  • volatile 변수는synchronized의 가시성을 가지지만 원자성을 갖추지 못한다.이것은 바로 라인이volatile 변수의 최신 값을 자동으로 발견할 수 있다는 것이다.
  • volatile 변수는 매번 사용할 때마다 현재 volatile 변수의 최신 값을 얻을 수 있습니다.그러나volatile 변수는 합병의 정확성을 보장하지 않는다.
  • Volatile 변수는 라인 보안을 제공하는 데 사용할 수 있지만 매우 제한된 그룹의 용례에만 적용될 수 있습니다. 여러 변수 사이 또는 어떤 변수의 현재 값과 수정된 값 사이에는 제약이 없습니다.

  • 따라서volatile을 단독으로 사용하면 계수기, 상호 배척 자물쇠, 또는 여러 변수와 관련된 변하지 않는 (Invariants) 클래스 (예를 들어 'start <=end') 를 실현할 수 없습니다. 
    volatile용 장면 모드 #1: 상태 플래그
    아마도volatile 변수의 규범을 실현하는 데는 단지 하나의 브리 상태 표지만 사용할 수 있으며, 예를 들어 초기화를 완성하거나 정지를 요청하는 중요한 일회성 이벤트가 발생했음을 지시하는 데 사용될 것이다.
         volatile boolean shutdownRequested;  
          
        ...  
          
        public void shutdown() {   
            shutdownRequested = true;   
        }  
          
        public void doWork() {   
            while (!shutdownRequested) {   
                // do stuff  
            }  
        }  

    좋은 웹페이지 즐겨찾기