[자바 고양이 설] 자바 다 중 스 레 드 메모리 보이 기 (다음 편)
지난번 에 우 리 는 synchronized 상호 배척 코드 의 실현 과정 에 대해 말 했 습 니 다. 잊 어 버 리 거나 모 르 는 것 이 있 으 면 전편 에 가 보 세 요.[자바 고양이 설] 자바 다 중 스 레 드 메모리 보이 기 (상편)
오늘 우 리 는 재 정렬 을 알 아 보 자.
코드 를 작성 하 는 순서 와 실행 을 실현 하 는 순서 가 다 릅 니 다. 명령 재 정렬 은 컴 파일 러 나 프로세서 가 프로그램의 성능 을 향상 시 키 기 위 한 최적화 입 니 다. 1. 컴 파일 러 최적화 의 재 정렬 (컴 파일 러 최적화) 2. 명령 급 병렬 재 정렬 (프로세서 최적화) 3. 메모리 시스템 의 재 정렬 (프로세서 최적화) 으로 나 눌 수 있 습 니 다.
한편, as - if - serial 의미 원칙 은 아무리 정렬 을 다시 하 더 라 도 프로그램 이 실 행 된 결 과 는 코드 순서 로 실 행 된 결과 와 일치 해 야 한 다 는 것 을 말한다.
int num1 = 1;
int num2 = 2;
int sum = num1 + num2;
실 행 된 단일 라인 의 경우 1, 2 줄 의 순 서 는 다시 배열 할 수 있 지만 3 줄 은 이 로 인해 정렬 할 수 없 으 며, 다시 정렬 하 는 것 은 단일 라인 에 메모리 의 보이 지 않 는 문 제 를 가 져 오지 않 습 니 다.
그러나 다 중 스 레 드 에서 프로그램 이 엇 갈 려 실 행 될 때 정렬 을 다시 하면 메모리 에 문제 가 생 길 수 있 습 니 다.
여기에 몇 가지 원인 을 나열 하여 공유 변수 온라인 프로 세 스 간 에 보이 지 않 는 원인: 1. 스 레 드 의 교차 실행 (synchronized 원자 성) 2. 정렬 결합 스 레 드 교차 실행 (synchronized 원자 성) 3. 공유 변수 업데이트 후의 값 은 작업 메모리 와 메 인 메모리 간 에 제때에 업데이트 되 지 않 았 습 니 다 (synchronized 가시 성)
다른 대상 volatile 에 게 는 가시 성 을 실현 하 였 으 나 원자 성 을 보장 할 수 없습니다 (volatile 변수 가 조작 에 부합 하 는 원자 성 을 보장 할 수 없습니다)
깊이 있 게 말 하면 메모리 장벽 가입 과 정렬 금지 최 적 화 를 통 해 이 루어 진다.1. volatile 변수 에 대해 쓰기 작업 을 수행 할 때 쓰기 작업 후에 store 장벽 명령 을 추가 합 니 다. 2. volatile 변수 에 대해 읽 기 작업 을 수행 할 때 읽 기 전에 load 장벽 명령 을 추가 합 니 다.
이로써 우 리 는 volatile 변 수 를 읽 고 쓰 는 두 가지 조작 으로 나 눌 수 있다.
스 레 드 가 volatile 변 수 를 쓰 는 과정: 1. 스 레 드 작업 메모리 에서 volatile 변수 던 전의 값 을 변경 합 니 다. 2. 변 경 된 던 전의 값 을 작업 메모리 에서 주 메모리 로 갱신 합 니 다.
스 레 드 가 volatile 변 수 를 읽 는 과정: 1. 주 메모리 에서 volatile 변수의 최신 값 을 읽 고 스 레 드 의 작업 메모리 에서 2. 작업 메모리 에서 volatile 변 수 를 읽 는 복사 본
주의: volatile 은 원자 성 을 보장 할 수 없습니다.
다 중 스 레 드 에서 volatile 변 수 를 안전하게 사용 하려 면 몇 가지 조건 을 동시에 만족 시 켜 야 합 니 다. 1. 변수 에 대한 기록 작업 은 현재 값 에 의존 하지 않 습 니 다.
- :number++、count = count * 5
- :boolean 、
2. 이 변 수 는 다른 변 수 를 가 진 불변 식 에 포함 되 지 않 습 니 다.
- : low < up
마지막 으로 이 두 상 대 를 비교 해 보도 록 하 겠 습 니 다.
- volatile , synchronized ,
- ,volatile ,volatile
- synchronized , , volatile ,
- volatile synchronized
본 고 는 이미 개인 기술 공중 번 호 를 전재 하 였 습 니 다: Uncle CatMy Self 환영 댓 글 토론 과 좋아요 이전 추천: [자바 고양이 설] 자바 다 중 스 레 드 메모리 가시 성 (전편) 다음 추천: [자바 고양이 설] 자바 대상 의 행위
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【eclipse】같은 파일을 2개 열고 싶다【에디터의 분할】「이런 것은 다른 클래스로 나누어야 한다!」라든지 있다고는 생각합니다만. 실제로 실무 속에서 프로그램을 쓰고 있으면, 이런 소스에 눈에 걸리는 일도 적지 않을까···. 그건 그렇고, 내 노트북에서 이렇게 보입니다 네...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.