volatile 을 통 해 스 레 드 간 의 가시 성 을 검증 합 니 다.

이 글 은 주로 volatile 을 통 해 스 레 드 간 의 가시 성 을 검증 하 는 것 을 소개 하 였 으 며,글 에서 예시 코드 를 통 해 매우 상세 하 게 소개 하 였 으 며,여러분 의 학습 이나 업무 에 대해 어느 정도 참고 학습 가 치 를 가지 고 있 으 며,필요 한 친 구 는 참고 할 수 있 습 니 다.
JVM 실행 프로그램의 실 체 는 스 레 드 이기 때문에 모든 스 레 드 가 생 성 될 때 JVM 은 작업 메모리(일부 부분 은 스 택 공간 이 라 고 함)를 만 듭 니 다.작업 메모 리 는 모든 스 레 드 의 개인 데이터 영역 이 고 자바 메모리 모델 에 모든 변 수 를 메 인 메모리 에 저장 하도록 규정 합 니 다.메 인 메모 리 는 공유 메모리 영역 이 고 모든 스 레 드 에 접근 할 수 있 습 니 다.그러나 스 레 드 는 변 수 를 작업 메모리 에서 해 야 합 니 다.먼저 변 수 를 메 인 메모리 에서 복사 한 자신의 작업 메모리 공간 에서 작업 한 다음 에 변 수 를 조작 해 야 합 니 다.작업 이 끝 난 후에 변 수 를 메 인 메모리 에 기록 해 야 합 니 다.메 인 메모리 의 변 수 를 직접 조작 할 수 없습니다.각 스 레 드 의 작업 메모리 에 메 인 메모리 의 변수 부 목 복사 가 저장 되 어 있 습 니 다.따라서 서로 다른 스 레 드 간 에 상대방 의 작업 메모리 에 접근 할 수 없습니다.스 레 드 간 통신(전송 값)은 메 인 메모리 로 이 루어 져 야 합 니 다.간단 한 접근 과정 은 다음 과 같 습 니 다.

코드 인증 은 다음 과 같 습 니 다.

import java.util.concurrent.TimeUnit;

class MyData{
   //      ,volatile        
   volatile int number = 0;
   //      
   public void changeNumber(){
     this.number = 60;
   }
}
public class VolatileDemo {
  public static void main(String[] args) {
    //      
    MyData myData = new MyData();
    new Thread(() -> {
      System.out.println(Thread.currentThread().getName()+"     ,     :"+myData.number);
      //AAA       
      try{
        TimeUnit.SECONDS.sleep(3);
      }catch(Exception e){
        e.printStackTrace();
      }
      //AAA          60
      myData.changeNumber();
      System.out.println(Thread.currentThread().getName()+"          :"+myData.number);
    },"AAA").start();

    while(myData.number == 0){
      //      main  , number=0         , number=60         。
    }
    System.out.println(Thread.currentThread().getName()+"       :"+myData.number);
  }
}
결과 전시:
1.초기 매개 변수 number 에 volatile 을 추가 하지 않 았 습 니 다.

2.초기 매개 변수 number 에 volatile 추가:

요약:
volatile 은 JAVA 가상 기기 가 제공 하 는 경량급 동기 화 체제 로 volatile 의 세 가지 특징 은 가시 성 을 확보 하고 원자 성 을 확보 하지 않 으 며 명령 의 재배 치 를 금지한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기