(2) 동기와 병행 프로그래밍 자바의 원칙의 휘발성 기초 예술 실현

정의 및 휘발성의 구현

자바 프로그래밍 언어는 액세스 공유 변수에 스레드, 변수는 배타적 잠금 스레드 만이 변수 통과해야 정확하고 일관된 업데이트를 보장하기 위해 공유 할 수 있습니다. 필드가 휘발성 선언하는 경우, Java 스레드 메모리 모델 보장하지만이 모든 스레드는이 변수의 값이 동일 볼 수있다.

잠금 접두사

휘발성 변수 읽기 수정 기록이 변수를 공유하는 경우, JVM이 프로세서 로크 프리픽스 명령을 전송하고, 상기 명령 프리픽스 잠금 멀티 코어 CPU 프로세서는 다음의 두 가지를 제기
(1) 현재의 프로세서 캐시 라인 시스템 메모리에 데이터가 백
(2)이 작업 메모리 어드레스 다른 CPU의 데이터를 캐시 메모리에 다시 기록 될 것이다 올바르지 않습니다.
가공하는 속도, 메모리를 증가시키기 위해 프로세서에서 직접 통신하지 않고, 먼저 시스템 메모리는 데이터를 조작하기 전에 내부 캐시 (L1, L2 등)를 판독하는 것이 아니라 작업이 완료 알고 메모리 쓰기 아니다. 당신이 선언하면 휘발성 변수 작성, JVM은 프로세서로 전송됩니다 잠금 접두사 지침 이 변수 데이터 캐시 라인은 시스템 메모리에 다시 기록됩니다. 다른 경우 프로세서 캐시 값 다음 또는 이전과는 계산이나 작업을 수행 문제. 따라서, 멀티 스레드 프로그래밍을 동일한 각 프로세서 캐시에 대한 값을 보장하기 위해서는, 것이다 일관성 캐시 각 프로세서 확인할지 여부 때 버스에 전송되는 데이터를 스니핑하여 날짜 자체 캐시 값 자신의 메모리 어드레스에 대응하는 라인 캐시 프로세서 발견 수정되어, 현 캐시 라인은 데이터 수정 작업의 상기 프로세서는, 시스템은 판독 데이터 메모리 프로세서로부터 재 때, 상기 프로세서가 비활성으로 설정된다 캐시.

두 가지의 원칙의 휘발성 실현

(1) 쓰기 다시 캐시 메모리에 프로세서 원인 잠금 접두사 지침
(2) 프로세서의 캐시는 원인 다른 프로세서의 캐시 메모리 무효로 다시 작성

원칙과 동기화 구현의 응용 프로그램

자바의 각 개체는 잠금 장치로 사용할 수 있습니다.
통상 동기 방법 (1), 로크가 오브젝트의 현재 인스턴스
정적 동기화 방법 (2), 로크가 현재 클래스의 클래스 오브젝트 인
블록 동기화 방법 (3) 오브젝트는 고정 브래킷의 구성을 동기화된다.
스레드 시도 액세스 동기화 블록에, 그는 먼저 잠금을 획득해야하는 경우, 잠금이 해제되어 있어야합니다 또는 예외가 슬로우 될 때 시작했다.

자바 객체 헤더

잠금은 자바 객체의 존재의 발전와 동기화됩니다.
조성 객체 헤더 마크 말씀과 클래스 메타 데이터 주소 배열의 길이 또는

마크 워드

기본 스토리지 오브젝트의 해시 코드, 세대 나이와 플래그.
32 JVM 마크 말씀 기본 스토리지 구성 테이블

잠금 상태 25bit 4 비트 이 바이어스 잠금인지 1 비트 2 비트 잠금 플래그
잠금이없는 상태 해시 코드 객체 피사체의 세대 세 0 01

작동시, 마크 말씀에 저장된 데이터 잠금 플래그에 따라 달라집니다.
마크 워드 나타난 상태의 변화
그림 삽입 설명 여기
는 가상 머신 (64), 64 비트 워드 크기 표시, 저장 구조 테이블
그림 삽입 설명 여기

JVM을의 원칙의 실현에 동기화

JVM은 입구와 출구에 따라 모니터 오브젝트 코드 동기화 및 블록 동기화의 방법을 구현하기 위해,하지만 모두 구현은 동일하지 않습니다. 동기화 방법, 모니터 명령어를 입력하여 monitorexit 동기 부호 블록은 다른 방식으로 사용된다.
monitorenter 명령이 동기 부호의 선두 위치에 컴파일 블록에 삽입되고 monitorexit 각각 대응하는 한 쌍의 monitorexit 있어야되도록 방법 및 예외는 JVM의 monitorenter의 단부에 삽입된다. 어떤 오브젝트가 갖는 모니터 와 연관된을하고, 경우에 모니터 후이 잡혀, 잠겨있다. monitorenter 명령에 스레드 실행은 락 객체를 얻기 위해 노력하고 모니터에 해당하는 객체의 소유권을 획득하려고 시도합니다.

스핀 락

그것은 잠금이 다른 스레드에 의해 인수 된 경우 스레드가 잠금을 획득 할 수있는 시간을 의미, 다음 스레드주기 위해 대기하고 잠금 루프를 종료합니다 인수 될 때까지 잠금이 성공적으로 인수 여부를 결정하는 것을 계속한다.

CAS 알고리즘

즉, 비교 및 ​​스왑 (비교 및 스왑) 잘 알려진 잠금이없는 알고리즘입니다. 스레드의 부재에 변수를 동기화 여러 스레드 사이에 사용 잠금 변수 동기화에 차단하지 않을 경우 잠금이없는 프로그램입니다, 그것은 또한 비 차단 동기화 (동기화를 비는 차단)이라고합니다. CAS 알고리즘은 세 개의 피연산자를 포함

및 쓰기 메모리 값 V를 읽을 필요성

비교 값 A

B는 새 값을 쓸 계획

상기 값은 V 원자 방법의 값을 갱신하여 새로운 값을 가지는 V A, B CAS 동일한 경우에만, 그 임의의 작업을 수행하지 않을 경우 (비교 치환은 원자 동작이다). 일반적으로 스핀 동작, 즉 지속적으로 시도합니다.

게시 24 개 원래 기사 · 원 찬양 1 · 조회수 549

추천

출처blog.csdn.net/qq_45366515/article/details/105116001