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 의 세 가지 특징 은 가시 성 을 확보 하고 원자 성 을 확보 하지 않 으 며 명령 의 재배 치 를 금지한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java에서 volatile 키워드의 역할 및 사용법 상세 설명volatile 키워드의 역할은 시스템의 모든 라인이 이 키워드 수식에 대한 변수를 공유하고 볼 수 있도록 하는 것이다. 공유 변수가volatile로 수식될 때, 수정된 값이 메모리에 즉시 업데이트되고, 다른 라인이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.