예술 자바 병행 프로그래밍 (6) 발생-전에

약 일 - 전에

JMM에서, 동작을 실행 한 결과는 본 일어나도 전에 관계 두 작업 사이 여야 볼 수있는 또 다른 동작을 필요로하는 경우
발생-전에 규칙
(1) 프로그램 순서 규칙 : 스레드를 각각 조작, 그것은 발생-전에 스레드의 후속 작업을한다.
(2) 잠금 규칙을 모니터링 : 잠금을 해제, 일 - 더 전에 잠금 이후에 잠금.
. (3) 휘발성 가변 규칙 : 휘발성 도메인을 작성, (가) 발생-전에 휘발성 도메인의 후속 판독에서
(4) 전이는 A는 경우 (가) 사전이 일어나는 B, 그리고 B (가) 사전이 발생 C, 다음 적 있었 전과 C는
사전 동작 후에 동작 이전에 수행되어야한다는 것을 의미하지 않는다하는 일어나도 전에 두 동작 간의 관계있다! 이 발생하기 전에 전 - 가시의 작동 후에 오직 하나의 동작 (실행 결과)가 필요하고 제 2 동작 전에 이전 동작을 시퀀싱.
그림 삽입 설명 여기

어떻게 정의하기 전에 -

(1) 상기 발생-전에 운전 조작하기가 제 동작의 동작의 실행 결과를 알 수있는 경우, 제 2 동작 전에 실행의 일차 및 방전 작업
(2) 두 개의 작동 (가) 발생-전에 사이의 관계, 그것은 발생-이전에 관계가 수행되는 Java 플랫폼의 구현의 특정 순서를 지정해야한다는 것을 의미하지 않습니다. 재 배열 후의 결과는 상기 결과와 일치뿐만 일어나기 전에-경우 관계가 수행되고, 그 다음이 재정렬 불법 아니다 (JMM 그러한 재정렬을 허용)

발생-전에 규칙

(1)은 프로그램 시퀀스의 규칙 : 스레드가 일어나도 전에 스레드 후속 동작 각 조작.
(2) 모니터 락 규칙 : 잠금을 해제, 발생-전에 잠금 이후의 잠금
(3.) 휘발성 변수 규칙 : 휘발성 도메인, 이런-전에 다음에 도메인 휘발성 읽기 쓰기 .
그림 삽입 설명 여기
(4) 전이 A는 B 전에-발생하고, B가 C 전 - 발생 후 일어나도 전에 C 경우
(5.) (시작) 규칙 : 스레드 A가 실행 조작 ThreadB.start는 () (스레드 B를 기동)하면 다음 스레드
ThreadB.start () 연산이 발생하기 전에 - 스레드 B. 어떤 조치
그림 삽입 설명 여기
미리 스레드가 공유 변수를 수정하고 스레드 B를시키기 시작한 후 처음 B (ㄴ 가시의 변형 례를) 공유 변수를 읽 스레드.
(6.) 참가 () 규칙 : 스레드 A가 실행 작업 ThreadB.join () 반환이 성공적으로하고있는 다음의 발생 - 이전하는 경우 () 작업에서 스레드 A와 스레드 B ThreadB.join에서 성공적으로 반환합니다.
그림 삽입 설명 여기

AS-IF-직렬

실행 결과 (병렬도를 향상시키기 위하여 프로세서 컴파일러)을 재정렬하는 방법에 상관없이 (단일 스레드) 프로그램이 변경 될 수 없다. 컴파일러 및 런타임 프로세서로-IF-직렬 준수해야
그 결과를 변경할 수 있기 때문에 재정렬하는 재정렬 할 운전 데이터 사이의 관계의 존재에 의존 할 것이다 컴파일러 프로세서. 이러한 작업은 컴파일러와 프로세서를 다시 정렬 할 수있는 경우, 데이터의 부재는 작업 간의 종속성.

    double pi=3.14; A
    double r=1.0; B
    double area=pi*r*r; C

C는 재정렬 발생 앞서 AB, A와 B의하지 않는
단일 스레드 프로그램 의미론의 결과를 변경하지-IF-직렬 보장 일어나도 전에 관계 보장 멀티 스레드 프로그램의 결과는 정확하게 변경 동기화되지 .

게시 24 개 원래 기사 · 원 찬양 한 · 전망 (546)

추천

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