자바 병발 프로 그래 밍 예술의 병발 메커니즘 의 밑바닥 실현 원리

3511 단어 독서 노트
자바 코드 는 컴 파일 후 자바 바이트 코드 가 됩 니 다.바이트 코드 는 클래스 로 더 에 의 해 JVM 에 불 러 옵 니 다.JVM 은 바이트 코드 를 실행 합 니 다.최종 적 으로 어 셈 블 리 명령 으로 CPU 에서 실 행 됩 니 다.자바 에서 사용 하 는 병행 체 제 는 JVM 의 실현 과 CPU 의 명령 에 의존 합 니 다.이 장 에서 우 리 는 밑바닥 에 깊이 들 어가 자바 병발 메커니즘 의 밑바닥 실현 원 리 를 탐색 할 것 이다.
volitate
정의.
자바 언어 규범 제3 판 에서 volatile 에 대한 정 의 는 다음 과 같다.자바 프로 그래 밍 언어 는 스 레 드 가 공유 변 수 를 방문 할 수 있 도록 합 니 다.공유 변 수 를 정확 하고 일치 하 게 업데이트 할 수 있 도록 스 레 드 는 배타 적 자 물 쇠 를 통 해 이 변 수 를 단독으로 얻 도록 해 야 합 니 다.자바 언어 는 volatile 을 제공 하여 어떤 경우 에는 자물쇠 보다 더 편리 합 니 다.한 필드 가 volatile 로 밝 혀 지면 자바 스 레 드 메모리 모델 은 모든 스 레 드 가 이 변 수 를 보 는 값 이 일치 하도록 확보 합 니 다.
의 원리
  • 현재 CPU 캐 시 에 있 는 데 이 터 를 메모리 에 기록 하 는 동시에 캐 시 일치 체 제 는 두 개 이상 의 CPU 캐 시 메모리 영역 데 이 터 를 막 을 수 있 습 니 다
  • 탐색 방식 을 통 해 다른 CPU 가 공유 메모리 의 데 이 터 를 수정 하 는 지 확인 합 니 다.있 는 것 을 발견 하면 캐 시 데이터 가 잘못 되 었 습 니 다.그러면 다음 에 데 이 터 를 방문 할 때 최신 데 이 터 를 방문 합 니 다
  • synchronized
    형식.
    4.567917.일반 방법 에 대해 자 물 쇠 는 현재 인 스 턴 스 대상 이다4.567917.정적 동기 화 방지 에 있어 자 물 쇠 는 현재 클래스 의 class 대상 이다4.567917.동기 화 방법 블록 에 대해 자 물 쇠 는 synchronized 괄호 안의 대상 이다실현 방식
    JVM 은 Monitor 대상 의 실현 방법 과 코드 블록 의 동기 화 를 바탕 으로 합 니 다.모든 대상 은 Monitor 와 관련 이 있 습 니 다.둘 다 Monitorenter 와 Monitorexit 명령 을 사용 하여 실현 할 수 있다.구체 적 인 잠 금 추가 과정 은 다음 과 같다.
    4.567917.Monitorenter 명령 이 동기 코드 를 삽입 하여 시작 하 는 부분
  • Monitorexit 동기 코드 삽입 종료 및 이상 부분(실행 중 이상 이 라면)
  • 4.567917.스 레 드 가 Monitorenter 명령 을 수행 할 때 잠 긴 대상(4.567914.)의 Monitor 대상 의 소유권 을 얻 으 려 고 시도 하고 나머지 부분 은 말 하지 않 아 도 알 수 있다
    기억 장치
    이로써 우 리 는 해결 되 지 않 은 문제 가 하나 더 있다.그것 이 바로 잠 긴 대상 이 어떻게 저 장 했 는가?사실 synchronized 에 대응 하 는 잠 금 은 자바 대상 머리 에 기록 되 어 있 습 니 다.자바 개체 헤드 저장 설명
    길이
    내용.
    설명 하 다.
    32/64bit
    Mark Word
    대상 의 hashCode 나 잠 금 정보 등 을 저장 합 니 다.
    32/64bit
    Class Meta Address
    대상 형식 데 이 터 를 저장 하 는 포인터 등
    32/64bit
    Array Length
    배열 의 길이(현재 대상 이 배열 이 라면)
    Mark Word 의 상태 변화
    잠 금 상태
    23bit
    2bit
    4bit
    1bit(잠 금 편향 여부)
    2 bit(잠 금 위치)
    경량급 자물쇠
    스 택 의 잠 금 기록 을 가리 키 는 지침
    00
    헤비급 자물쇠
    상호 배척 량(헤비급 자물쇠)을 가리 키 는 지침
    10
    GC 태그
    비다
    비다
    비다
    11
    편향 자물쇠
    스 레 드 ID
    Epoch
    대상 세대 별 연령
    1
    01
    Mark Word 의 저장 구조(64bit)
    잠 금 상태
    25bit
    31bit
    1bit (cms_free)
    4bit(세대 구분)
    1bit(잠 금 표시 위치)
    2bit(자물쇠 편향 여부)
    자물쇠 없 음
    unused
    hashCode
    0
    01
    편향 자물쇠
    ThreadID(25bit + 29bit)
    Epoch(2bit)
    0
    01
    업그레이드 와 최적화
    자 바 는 자 물 쇠 를 가 져 오고 자 물 쇠 를 방출 하 는 성능 소 모 를 줄 이기 위해'편향 자물쇠'와'경량급 자물쇠'를 도입 했다.
    편향 자물쇠
    경량급 자물쇠
    헤비급 자물쇠
    자물쇠 의 장단 점 대비
    자물쇠.
    장점.
    결점.
    적용 필드
    편향 자물쇠
    잠 금 추가 와 잠 금 해 제 는 추가 소모 가 필요 없 으 며,비 동기 화 방법 을 실행 하 는 것 에 비해 나 초 단위 의 차이 만 존재 합 니 다.
    만약 스 레 드 간 에 자물쇠 경쟁 이 존재 한다 면,자 물 쇠 를 취소 하 는 소 모 를 가 져 올 것 이다.
    동기 블록 에 한 개의 스 레 드 만 접근 하 는 장면 을 사용 합 니 다.
    경량급 자물쇠
    경쟁 은 막 히 지 않 고 프로그램의 응답 속 도 를 높 였 다.
    잠 금 경쟁 스 레 드 를 끝까지 얻 지 못 하면,자동 잠 금 을 사용 하면 CPU 가 소 모 됩 니 다.
    응답 시간 을 추구 합 니 다.동기 블록 실행 속도 가 매우 빠 릅 니 다.
    헤비급 자물쇠
    스 레 드 경쟁 은 차단 방식 을 사용 하여 CPU 를 소모 하지 않 습 니 다.
    스 레 드 가 막 혀 서 응답 시간 이 느 립 니 다.
    스루풋 을 추구 하고 동기 화 속도 가 비교적 길다.
    원자 조작
    원자 조작(atomic operation)은'중 단 될 수 없 는 하나 또는 일련의 조작'을 의미한다.
    하드웨어 등급 의 지원:버스 잠 금(잠 금 표 와 유사 하고 현재 CPU 만 메모리 와 통신 할 수 있 음),캐 시 잠 금(잠 금 줄 과 유사 하 며 현재 CPU 만 메모리 에 대응 하 는 데 이 터 를 수정 할 수 있 음)순환 CAS.본질 적 으로 CMPXCHG 명령 을 사용 하여 실현 하 였 다.그러나 CAS 는 ABA 가 존재 하고 자 회전 은 CPU 의 집행 효율 을 낮 추 며 여러 공유 변 수 를 직접 원자 조작 할 수 없다4.567917.자물쇠 체 제 를 사용 하여 원자 조작 을 실현 한다의문
    의문 이 있 으 면 토론 을 환영 합 니 다.

    좋은 웹페이지 즐겨찾기